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