2015-09-16 6 views
85

私のドッカー画像は、Jenkins CIサーバー上に構築され、当社のプライベートドッカーレジストリにプッシュされます。私の目標は、イメージの元々構築された状態を常に開始するdocker-compose環境を提供することです。ドッカーを作成して新鮮な画像から常にコンテナを再作成するにはどうすればよいですか?

私は現在、別のマシンでドッカーの作成1.3.2と1.4.0を使用していますが、以前のバージョンも使用していました。

私はいつもdocker-compose pull && docker-compose up -dコマンドを使用して、新しいイメージをレジストリから取得して起動しました。私は自分の好みの振る舞いがある時点まで予想どおりに機能していたと考えていますが、その後はいつもオリジナルの画像を起動するのではなく、以前に停止したコンテナを再実行し始めました(docker-compose up)。

この現象を回避する方法はありますか?そのようにして、docker-compose.yml設定ファイルに接続され、あらゆる呼び出し時にコマンドラインで何かを忘れないようにすることができますか?

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

答えて

101

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をやっているなら、それを望んでいないので、すべてを削除するだけであなたが望むようになるはずです。

更新:それが再構築される新しい何かがある場合はdocker-compose 1.7

+1

ええ、実際これは私がCIでやっていることです。なぜ私はそれについて言及していないのか分かりません。 –

+0

@dnephin 'docker-compose run -d'は存在しませんか?あなたは 'docker-upを-d'といいますか? –

+1

'' docker-compose pull'''の前に '' 'docker-compose rm -f'''を実行すると、さらに時間を節約できます – stephanlindauer

12

--force-recreateにはdocker compose upに渡すことができます。これには新鮮な容器を使用する必要があります。

私は、コンテナの再利用の背後にある理由は、開発中の変更を保存することだと思います。 Composeはボリュームと同様の機能を果たしますが、コンテナの再作成(再作成されたコンテナは前のボリュームに追加されます)との間でも存続します。これは、たとえば、Redisコンテナをキャッシュとして使用し、小さな変更を加えるたびにキャッシュを失いたくない場合などに役立ちます。それ以外の時はちょっと混乱します。

Composeファイルからこれを強制することはできません。

おそらく、不変のインフラストラクチャの原則と衝突します。反論はおそらく、あなたが本番で(まだ)Composeを使用していないことでしょう。また、不変のインフラがDockerの基本的なアイデアであることに私は同意できませんが、それは確かに良いユースケース/セールスポイントです。

+0

答えをありがとう。私はそれを設定レベルで強制するのが本当に便利だと思います。データベースコンテナのためにそれを強制し、デフォルトでアプリケーションコンテナのレクリエーションを無効にする。 –

+3

'--force-recreate'は私のためには機能しません...新しいバージョンがそこにあるにもかかわらず、イメージは引き出されません... – lisak

+0

@lisak私はそれが新しい画像を引っ張ったとは言いませんでした。それはしません。ローカルで利用可能な画像を使用して新しいコンテナを開始するだけです。ドッカープルを手動で実行する必要があります。 –

-2
$docker-compose build 

で追加された使用up --build。これは自動的にレポから新鮮なイメージを引っ張ってくると、あなたが前に使用してきた任意のパラメータで事前に作成されたキャッシュバージョンを使用することはありません

docker-compose build --no-cache 

:私のために働いた

34

唯一の解決策は、このコマンドでした。

13

現在の公式ではdocumentationすでに停止または部分的に取り除かれている場合は、上に作成されたコンテナ、ネットワーク、ボリューム、イメージを停止して削除するショートカットがあります。

あなたの画像やDockerfilesに新たな変更がある場合
docker-compose down 

は、次に使用:最後に

docker-compose build --no-cache 

docker-compose up

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

関連する問題