コンテナ起動時にプロセスを開始する
開発コンテナで作業している場合、コンテナが起動するたびにコマンドを実行したり、何かを開始したりしたいことがあるかもしれません。これを行う最も簡単な方法は、devcontainer.json
の postStartCommand
プロパティを使用することです。例えば、依存関係を最新の状態に保つためにコンテナに接続するたびに yarn install
を実行したい場合は、以下を追加できます。
"postStartCommand": "yarn install"
ビデオ: コンテナ作成時にnpm installを実行する
他のケースでは、プロセスを起動して実行し続けたい場合があります。これは、nohup
を使用し、プロセスを &
を使ってバックグラウンドに置くことで実現できます。例:
"postStartCommand": "nohup bash -c 'your-command-here &'"
ビデオ: コンテナが起動するたびに「npm start」を実行する
Linuxに詳しい方なら、systemd
と呼ばれるものによって管理されるバックグラウンドサービスを開始および停止するために systemctl
コマンドを使用できると期待するかもしれません。残念ながら、systemd
にはオーバーヘッドがあり、そのためコンテナでは通常使用されません。
多くの場合、代わりに実行できるコマンド(例えば、sshd
)があります。また、Debian/Ubuntuでは、/etc/init.d
の下に直接実行できるスクリプトがよくあります。
"postStartCommand": "/etc/init.d/ssh start"
これらのシステムには、インストールされているものに基づいて systemctl
または /etc/init.d
スクリプトを使用する service
コマンドも含まれています。
"postStartCommand": "service ssh start"
ビデオ: コンテナでSSHサービスを開始する
代わりに起動コマンドをDockerイメージに追加する
postStartCommand
は便利で、ソースツリー内のコマンドを実行できますが、代わりに、カスタムの ENTRYPOINT または CMD を使用してこれらの手順をDockerfileに追加することもできます。
devcontainer.json
でDockerfileを参照する場合、デフォルトのエントリポイントとコマンドは上書きされます。まず、overrideCommand
プロパティを使用してこの動作を無効にします。
"overrideCommand": false
多くのイメージはコマンドが指定されていない場合にすぐに終了するため、overrideCommand
プロパティのデフォルトは true
です。その代わりに、これをDockerfileで処理する必要があります。
次に、このDockerfileを検討してください。
FROM mcr.microsoft.com/devcontainers/base:1-ubuntu
COPY docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT [ "/docker-entrypoint.sh" ]
CMD [ "sleep", "infinity" ]
ここでの CMD
は、デフォルトでコンテナが実行され続けるようにします。起動ステップを ENTRYPOINT
に保持することで、イメージで docker run
を使用する場合やDocker Composeを使用する場合に、コマンドを安全に上書きできます。これは以下のように解決されます。
/docker-entrypoint.sh sleep infinity
次に、docker-entrypoint.sh
スクリプトを作成します。
#!/usr/bin/env bash
echo "Hello from our entrypoint!"
exec "$@"
このファイルで実行するものはすべて、コンテナが起動するたびに実行されます。ただし、最後の exec "$@"
行を含めることが重要です。これは、例における sleep infinity
コマンドが実行される原因となるためです。
最後に、Docker Composeを使用している場合は、コンテナの entrypoint プロパティも command プロパティも設定されていないことを確認してください。