私のdockerイメージはJenkins CIサーバー上に構築されており、私たちのプライベートDocker Registryにプッシュされています。私の目標は、もともと構築されていたイメージの状態を常に開始する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の現在の振る舞いは、このアプローチとは明らかに衝突しているように見えます。
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をやっているなら、あなたはそれを望んでいません。
更新:up --build
1.7で追加されたdocker-compose
を使う
私のために働いた唯一の解決策はこのコマンドでした:
docker-compose build --no-cache
これは自動的に新しい画像をリポジトリから取得し、以前に使用したことのあるパラメータであらかじめ作成されたキャッシュバージョンを使用しません。
現在の公式 のドキュメント では、upによって作成されたコンテナ、ネットワーク、ボリューム、およびイメージが既に停止しているか部分的に停止している場合、それらを停止および削除できます。削除されるなどして、それもトリックを行います:
docker-compose down
それからあなたがあなたのイメージまたはDockerfilesに新しい変更があったら:
docker-compose build --no-cache
最後に:docker-compose up
1つのコマンドで:docker-compose down && docker-compose build --no-cache && docker-compose up
あなたは--force-recreate
をdocker compose up
に渡すことができます、それは新しいコンテナを使うべきです。
コンテナーを再利用する理由は、開発中の変更を保存するためです。 Composeはボリュームと似たような動作をするので注意してください。これはコンテナの再作成の間も持続します(再作成されたコンテナは前のボリュームにアタッチされます)。これは、たとえば、Redisコンテナをキャッシュとして使用していて、小さな変更を加えるたびにキャッシュを失いたくない場合に役立ちます。他の時にはそれは単に混乱します。
私はあなたがComposeファイルからこれを強制することができる方法があるとは思わない。
おそらくそれは不変のインフラストラクチャの原則と衝突します。反対論はおそらくComposeを本番ではまだ使用していないということでしょう。また、不変のインフラがDockerの基本的な考え方であることに私は同意しませんが、それは確かに良いユースケース/セールスポイントです。