コンテナーの起動時にプロセスを開始する
開発コンテナーで作業している場合、コンテナーの起動時に毎回コマンドを実行したり、何かを開始したりしたい場合があります。これを実行する最も簡単な方法は、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 プロパティが設定されていないことを確認してください。