コンテナーAとコンテナーBの2つがあります。コンテナーAが開始すると、1つのプロセスが実行され、コンテナーは停止します。コンテナBは単なるWebアプリケーションです(たとえば、expressjs)。コンテナーBからAをキックスタートすることは可能ですか?
コンテナーにdockerへのアクセスを許可して、ホスト上の他のコンテナーを生成できるようにすることができます。これを行うには、コンテナー内のdockerソケットを公開します。例:
docker run -v /var/run/docker.sock:/var/run/docker.sock --name containerB myimage ...
これで、docker
クライアントをコンテナー内で使用できる場合、ホスト上のdockerデーモンを制御し、それを使用して「コンテナーA」を生成できます。
このアプローチを試す前に、セキュリティの考慮事項に注意する必要があります。Dockerへのアクセスは、ホストでのroot
アクセス権と同じです。つまり、Webアプリケーションにリモートの侵害がある場合、キーを渡しただけです。ホストを攻撃者に。これについて詳しく説明します この記事 。
ドッカーソケットを装着することで可能です。
コンテナA
標準出力(およびそのログ)に時刻を出力して終了します。
docker run --name contA ubuntu date
コンテナB
コツは、ホストのDockerソケットをマウントしてから、Dockerクライアントをコンテナーにインストールすることです。その後、ホストからdockerを使用しているかのようにデーモンと対話します。 dockerをインストールすると、コンテナーAが5秒ごとに再起動されます。
docker run --name contB -v /var/run/docker.sock:/var/run/docker.sock ubuntu bash -c "
apt-get update && apt-get install -y curl &&
curl -sSL https://get.docker.com/ | sh &&
watch --interval 5 docker restart contA"
ログを見ると、contAが呼び出されていることがわかります。
docker logs contA
とはいえ、Dockerは実際には長時間実行されるサービスを対象としています。 Docker githubの問題で、メンテナンスやcronジョブなどの短期間の「ジョブ」サービスを指定することについていくつかの話し合いがありますが、何も決定されておらず、はるかにコード化されていません。そのため、コンテナが稼働し続けるようにシステムを構築するのが最善です。