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 プロパティも設定されていないことを確認してください。