entrypoint.sh
Dockerfileの最後に定義されている次の行がコンテナ起動時の最後に実行されます。
ENTRYPOINT ["/sandbox/entrypoint.sh"]
このファイルを用意しておくのが docker の作法です。
ファイル名は ENTRYPOINT で指定すればよいので、なんでもよいのですが、
スクリプトを用意するときは分かりやすいようにentrypoint.sh
という名前にしたほうがよいでしょう
#!/bin/sh
# import configurations
tar -C /sandbox -cpf - var | tar -C / -xpvf -
# start www.py 8080/tcp
/var/www/libexec/www.py &
/bin/sh
解説
説明のため行番号をふりました
0001 #!/bin/sh
0002
0003 # import configurations
0004 tar -C /sandbox -cpf - var | tar -C / -xpvf -
0005
0006 # start www.py 8080/tcp
0007 /var/www/libexec/www.py &
0008
0009 /bin/sh
- このファイルはコンテナの中で実行されていることに注意してください(ホスト側とは一切関係ありません)
#
より右側はコメントです(0003と0006行はコメント)- 0004 行目は、/sandbox/var (/sandbox ディレクトリにある var) を /var へコピーしています
- /sandbox にあるファイル群の大元は、 ホスト側の docker build を実行するディレクトリにある files ディレクトリからコピーされたものです
- コンテナの起動時に、 コンテナ内の /sandbox から www.py 関係のファイル群がある /sandbox/var/www を /var/www へコピーしています (注: /var 全体をコピーしていますが、実質、中身は /sandbox/var/www 以下だけなんです)
- 半分は、起動時に動的にコンテナ内を変更する例としてやってます。 Dockerfile で ./files/var/www をコンテナ内の /var/www へコピーしておけば0004行は不要です
- 0007 行目で www.py を実行しています。
&
をつけてバックグラウンドで実行(対話的な処理はしないので裏側で実行しつづけろという命令)です - 最後に(この例では 0009 行目で)終わらないプログラムを実行してください。
ここでは /bin/sh (Bourne shell)を実行し、対話的処理を待っています(対話処理を待って無限ループで待機)。
終わらないプログラムを実行しないとコンテナはそのまま終了してしまいます。よくある例としては
- シェル(例: /bin/sh とか /bin/bash)を実行し、待ち続ける
- サーバプロセスを daemon 化せずに実行
/usr/bin/sshd -D
/usr/bin/nginx -g "daemon off;"