docker-composeで常に新しいイメージからコンテナーを再作成するにはどうすればよいですか?


198

私のDockerイメージはJenkins CIサーバー上に構築され、私たちのプライベートDockerレジストリにプッシュされます。私の目標は、常に最初に構築されたイメージの状態を開始するdocker-composeを使用して環境をプロビジョニングすることです。

現在、さまざまなマシンでdocker-compose 1.3.2および1.4.0を使用していますが、以前のバージョンも使用していました。

私は常にdocker-compose pull && docker-compose up -dコマンドを使用して、レジストリから新しいイメージをフェッチし、起動しました。私の好みの動作は、特定の時点まで予想どおりに機能していたと思いますが、それ以来docker-compose up、最初にビルドされたイメージを毎回開始するのではなく、以前に停止したコンテナーを再実行し始めました。

この動作を取り除く方法はありますか?その方法は、すべての呼び出し時にコマンドラインで何かを「忘れない」ことに依存しないようにdocker-compose.yml設定ファイルに配線されている方法でしょうか?

ps。私の目標を達成する方法を見つけることに加えて、私はこの行動の背景についてもう少し知りたいです。Dockerの基本的な考え方は、不変のインフラストラクチャを構築することだと思います。docker-composeの現在の動作は、このアプローチと衝突しているように見えるだけです。

回答:


232

docker-compose up --force-recreateこれは1つのオプションですが、CIに使用している場合は、ビルドを開始しdocker-compose rm -fてコンテナーとボリュームを停止して削除します(その後、プルとアップで実行します)。

これは私が使用するものです:

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

コンテナーが再作成される理由は、使用される可能性のあるデータボリュームを保持するためです(またup、かなり高速化されます)。

CIを実行している場合は、それを望まないので、すべてを削除するだけで必要なものが得られます。

更新:1.7 up --buildで追加された使用法docker-compose


1
ええ、実際、これは私がCIでも行うことです。なぜ私がそれを言及しなかったのかわからない...
エイドリアン・ムアット

@dnephin docker-compose run -dは存在しませんか?あなたはdocker-compose up -dノーと言いたいですか?
ギヨームヴィンセント

2
docker-compose pull前に走ればdocker-compose rm -fさらに時間を節約できる
stephanlindauer

2
最後の-dフラグとは何ですか?
デビッドJ.デイビス

3
「-d分離モード:コンテナーをバックグラウンドで実行する」
dnephin

135

私のために働いた唯一の解決策はこのコマンドでした:

docker-compose build --no-cache

これにより、リポジトリから新しいイメージが自動的にプルされ、以前に使用したパラメーターで事前にビルドされたキャッシュバージョンは使用されません。


1
さらに、Windows 10では、DNSサーバーを[自動]から[固定]または[固定]から[自動]に設定するのに役立ちます。
qräbnö

2
docker-comopseバージョン2を使用したOS Xビルドで私のために働いた
RoboBear

1
OS X dockerで動作しました。
HelloWorld

55

現在の公式ドキュメントでは、upによって作成されたコンテナー、ネットワーク、ボリューム、およびイメージを停止して削除するショートカットがあり、それらがすでに停止しているか、部分的に削除されている場合などは、トリックも実行します。

docker-compose down

次に、イメージまたはDockerfileに新しい変更がある場合は、次を使用します。

docker-compose build --no-cache

最後に:docker-compose up

1つのコマンドで: docker-compose down && docker-compose build --no-cache && docker-compose up


2
docker-compose build --no-cacheDockerfileに変更がある場合にのみ必要です。
Victor Timoftii

確かに、ビクター。ありがとう!コンテナ起動時に実行されるモジュール/アプリケーションを更新した後も必要だと思いました。これらの場合、を実行する前にdocker-compose up、でサービスを再構築する必要がありますdocker-compose build
ivanleoncz

18

あなたは渡すことができます--force-recreatedocker compose up新鮮なコンテナを使用すべき、。

コンテナを再利用する理由は、開発中の変更を保存するためだと思います。Composeはボリュームでも同様の処理を行うことに注意してください。これは、コンテナーの再作成の間も持続します(再作成されたコンテナーは、その前のボリュームにアタッチされます)。これは、たとえば、Redisコンテナーをキャッシュとして使用していて、小さな変更を行うたびにキャッシュを失いたくない場合に役立ちます。それ以外の場合は、混乱するだけです。

これをComposeファイルから強制する方法はないと思います。

間違いなく、それは不変のインフラストラクチャの原則と衝突します。反論はおそらく、(まだ)本番環境でComposeを使用していないことです。また、不変インフラストラクチャーがDockerの基本的な考え方であることは確かですが、これは確かに優れたユースケース/セールスポイントです。


答えてくれてありがとう。私はそれを構成レベルで強制することは本当に便利だと思います、例えば。アプリのコンテナに対してデフォルトでデータベースコンテナを無効レクリエーションのためにそれを強制する...
クリストフJozsa

8
--force-recreate動作しません...新しいバージョンがそこにあるのに画像が
取得

1
@lisak私はそれが新しい画像を引っ張ったとは決して言わなかった。そうではありません。ローカルで利用可能なイメージを使用して新しいコンテナを開始するだけです。手動でdocker pullを実行する必要があります。
Adrian Mouat

2
docker-compose up --build

または

docker-compose build --no-cache

1
可能な場合は、コードだけでなく、追加の説明を提供できるように努力してください。このような回答は、コミュニティのメンバー、特に新しい開発者がソリューションの推論をよりよく理解するのに役立ち、フォローアップの質問に対処する必要を防ぐのに役立ちます。
ラジャン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.