VS Codeのエージェントモードを拡張するには、を試してください!

コンテナーの起動時にプロセスを開始する

開発コンテナーで作業している場合、コンテナーの起動時に毎回コマンドを実行したり、何かを開始したりしたい場合があります。これを実行する最も簡単な方法は、devcontainer.jsonpostStartCommand プロパティを使用することです。たとえば、依存関係を最新の状態に保つためにコンテナーに接続するたびに 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 プロパティが設定されていないことを確認してください。