1. ホーム

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

2022-03-30 05:37:03

質問

私の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の挙動は、このアプローチと明らかに衝突しているように見えます...それとも、私はここでいくつかのポイントを見逃したのでしょうか?

解決方法は?

docker-compose up --force-recreate というのも一つの選択肢ですが、CIに使うのであれば、私ならビルドを開始するときに docker-compose rm -f でコンテナとボリュームを停止して削除します(その後、pull と up でフォローします)。

これは私が使っているものです。

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 で追加された docker-compose 1.7