docker-composeを取得してリポジトリから最新のイメージを使用する方法


89

何が間違っているのかわかりませんが、docker-compose up最初にシステムから古いコンテナを完全に削除しないと、レジストリから最新のイメージを使用できません。docker-compose pullが新しいイメージをフェッチしたにもかかわらず、composeは以前に開始されたイメージを使用しているようです。

私が見て、常に新鮮なイメージから容器を再作成するために、ドッキングウィンドウ-コンを取得する方法?これは私の問題に似ているように見えましたが、本番サーバーで使用できるソリューションを探していて、開始する前にすべてのコンテナーを削除したくないため、提供されているソリューションはどれも機能しません。再び(データ損失の可能性?)。変更されたイメージの新しいバージョンを検出し、それらをプルしてから、それらの新しいイメージでサービスを再起動するためだけに、composeを作成したいと思います。

このための簡単なテストプロジェクトを作成しました。このプロジェクトでは、新しいビルドごとにバージョンnrを増やすことが唯一の目標です。作成されたnginxサーバーを参照すると、バージョンnrが表示されます(これはローカルで期待どおりに機能します)。

dockerバージョン:1.11.2 docker-composeバージョン:1.7.1 OS:docker-toolboxを使用してCentOS7とOSX10.10の両方でテスト済み

私のdocker-compose.yml:

version: '2'
services:
  application:
    image: ourprivate.docker.reg:5000/ourcompany/buildchaintest:0.1.8-dev
    volumes:
      - /var/www/html
    tty: true

  nginx:
    build: nginx
    ports:
      - "80:80"
    volumes_from:
      - application
    volumes:
      - ./logs/nginx/:/var/log/nginx
  php:
    container_name: buildchaintest_php_1
    build: php-fpm
    expose:
      - "9000"
    volumes_from:
      - application
    volumes:
      - ./logs/php-fpm/:/var/www/logs

jenkinsサーバーで次のコマンドを実行してイメージをビルドしてタグ付けします

cd $WORKSPACE && PROJECT_VERSION=$(cat VERSION)-dev
/usr/local/bin/docker-compose rm -f
/usr/local/bin/docker-compose build
docker tag ourprivate.docker.reg:5000/ourcompany/buildchaintest ourprivate.docker.reg:5000/ourcompany/buildchaintest:$PROJECT_VERSION
docker push ourprivate.docker.reg:5000/ourcompany/buildchaintest

ビルドが完了し、バージョンnrがバンプされるたびに、リポジトリに新しいバージョンタグが取得されるため、これは想定どおりの動作をしているようです。

私が今走ったら

docker-compose pull && docker-compose -f docker-compose.yml up -d

内容がdocker-compose.ymlとnginxおよびphpサービスを構築するために必要なDockerfilesのみである私のコンピューター上のフォルダーでは、取得する出力は、レジストリでタグ付けされているか、表示されている最新のバージョン番号ではありませんdocker-compose.yml(0.1.8)にありますが、それ以前のバージョンは0.1.7です。ただし、pullコマンドの出力は、新しいバージョンのイメージがフェッチされたことを示しています。

Pulling application (ourprivate.docker.reg:5000/ourcompany/buildchaintest:latest)...
latest: Pulling from ourcompany/buildchaintest
Digest: sha256:8f7a06203005ff932799fe89e7756cd21719cccb9099b7898af2399414bfe62a
Status: Downloaded newer image for docker.locotech.fi:5000/locotech/buildchaintest:0.1.8-dev

私が走った場合のみ

docker-compose stop && docker-compose rm -f

次に、 docker-compose upコマンド、新しいバージョンを期待どおりに画面に表示しますか。

これはdocker-composeの意図された動作ですか?つまり、本番サーバーでも、再docker-compose rm -f実行する前に常に実行する必要がありupますか?それとも私はここで穀物に対して何かをしているのですか、それが機能していない理由ですか?

目標は、ビルドプロセスでdocker-compose.ymlに必要なイメージのタグ付きバージョンをビルドして作成し、それらをプライベートレジストリにプッシュしてから、「本番環境へのリリース」でdocker-composeをコピーすることです。 ymlを本番サーバーに接続し、を実行docker-compose pull && docker-compose -f docker-compose.yml up -dして新しいイメージを本番環境で開始します。誰かがこれに関するヒントを持っているか、この種のセットアップのベストプラクティスチュートリアルを指摘できる場合は、それも非常に高く評価されます。


2
docker-compose up -d --force-recreate動作しませんでしたか?
BMitch 2016年

コンテナーを削除/再作成するときにデータが失われるリスクを回避するには、ホストまたは名前付きボリュームを使用します。他のコンテナにすでにホストボリュームを使用しているようです。空の名前付きボリュームは、最初に使用したときにイメージのボリュームの内容で初期化されます。
BMitch 2016年

--force-recreatedは機能しませんでした、いいえ:(データストレージにボリュームを使用しているので、データ損失の部分はおそらくそれほど関係ありません。しかし、docker-composermを実行する必要があることについてはまだ混乱しています。コンテナを再起動します。特にforce-recreateを使用するupコマンドは、代わりにそれを使用して新しいイメージに通知する必要がありますか?本番サーバーで強制的に削除する必要があるのは間違っていると感じています
Jensウェガー2016年

--force-recreateがコンテナを再作成していない場合は、にバグレポートを提出する必要があるかもしれませんdocker-compose。新しいイメージを使用すると、コンテナが再作成され、コンテナが削除されることに注意してください。また、プロセスでコンテナ固有のボリュームを削除しないと、で二度と使用しないデータのかなり長いぶら下がりリストを取得できますdocker volume ls -f dangling=true。したがって、修正は、docker-composeが実行する必要があることの前半です。
BMitch 2016年

はい、ありがとうございます!プロセスを確実に理解するためにもう少しいじる必要がありますが(Dockerに関してはまだ初心者です)、ビルドする前にdocker-compose rm-fのように見えます。
Jens Wegar 2016年

回答:


68

:latestレジストリ(Dockerハブなど)からタグに最新バージョンを使用していることを確認するには、最新のタグも再度プルする必要があります。変更された場合は、差分がダウンロードされ、開始されます。docker-compose up再度。

だからこれは行く方法です:

docker-compose stop
docker-compose rm -f
docker-compose pull   
docker-compose up -d

これを実行するイメージに接着してdocker-composeを開始し、イメージが最新の状態に保たれるようにします:https//hub.docker.com/r/stephanlindauer/docker-compose-updater/


40
docker-compose pull && docker-compose up -d十分です。実行中のコンテナーが古くなっているかどうかを自動的にチェックし、古くなっている場合は、最新のイメージで
コンテナーを

@MindaugasVarkalysあなたのコメントは受け入れられた答えであるはずです、サー。チャームのように機能します。
YuriyPozniak20年

37

最新のイメージを取得するには、docker-compose build--pullを使用します

私は実際には3in1である以下のコマンドを使用します

docker-compose down && docker-compose build --pull && docker-compose up -d

このコマンドは、サービスを停止し、最新のイメージをプルしてから、サービスを開始します。


たぶんdocker-compose pull、build:inの代わりにimage:を使用してサービスのイメージを更新するために追加するdocker-compose.yml必要がdocker-compose build --pullありますか、それともこれを行いますか?
oceanBT

私が手nginx uses an image, skipping--pullしたがってドッキングウィンドウ・コンビルドを使用して画像を更新していないとき。
アントニオアラウージョ

23

この質問を閉じるために、うまくいったように見えたものが実際に実行されています

docker-compose stop
docker-compose rm -f
docker-compose -f docker-compose.yml up -d

つまり、up再度実行する前にコンテナを削除します。

このようにするときに覚えておく必要があるのは、を実行しrm -fただけでデータボリュームコンテナも削除されるということです。これを防ぐために、削除する各コンテナを明示的に指定します。

docker-compose rm -f application nginx php

私の質問で言ったように、これが正しいプロセスであるかどうかはわかりません。しかし、これは私たちのユースケースではうまくいくように思われるので、より良い解決策が見つかるまで、これを使用します。


以前のコンテナバージョンにロールバックする場合はどうなりますか?すすぎ、繰り返しますか?
EightyEight 2016

1
試したことはありませんが、そうだと思います。コンテナのバージョンはdocker-compose.yml(例:myimage:2.0.1)で定義する必要があるため、ロールバックする場合は、docker-compose.ymlをロールバックするバージョン(例:2.0)に更新します。 .0)そして同じすすぎを繰り返します。
Jens Wegar 2016

ロールバックしたい場合は、コミットを元に戻し、Docker Hubをビルドしてから、アップデーターがそれを取得するのを待ちます。おそらく最も手の込んだシステムではありませんが、私の暇なプロジェクトでは機能します。
stephanlindauer 2017

すべてを削除することは解決策のようには見えませんが、より危険なもののようです。
PierrickM

3

これは、7〜8個のDockerプロダクションシステムで発生するのを見てきました。本番環境で私のために働いた別の解決策は、実行することでした

docker-compose down
docker-compose up -d

これによりコンテナが削除され、「up」が最新のイメージから新しいコンテナを作成するように見えます。

これは、変更されたコンテナごとにダウン+アップするという私の夢をまだ解決していません(連続して、ダウンタイムが少なくなります)が、コンテナを更新するために「アップ」を強制するように機能します。


docker-compose downafaikは、実行中のコンテナーにリンクされているデータボリュームコンテナーもすべて削除します。したがって、データボリュームに、実行中のコンテナから再作成できるものだけが含まれている場合は問題ありません。ただし、ボリュームに保持するデータが含まれている場合は注意が必要です。
Jens Wegar 2016

1
downデフォルトおよび現在のドキュメント(コンテナ、ネットワーク、デフォルトネットワーク)を削除します。Docは、「外部として定義されたネットワークとボリュームは削除されない」と述べています。名前付きボリュームで動作します(名前付きネットワークにも当てはまると思います)。
arminfro

3

オプション downこの問題を解決します

作成ファイルを実行します:

docker-compose -f docker/docker-compose.yml up -d

それから私はすべてを削除します down --rmi all

docker-compose -f docker/docker-compose.yml down --rmi all

Stops containers and removes containers, networks, volumes, and images
created by `up`.

By default, the only things removed are:

- Containers for services defined in the Compose file
- Networks defined in the `networks` section of the Compose file
- The default network, if one is used

Networks and volumes defined as `external` are never removed.

Usage: down [options]

Options:
    --rmi type          Remove images. Type must be one of:
                        'all': Remove all images used by any service.
                        'local': Remove only images that don't have a custom tag
                        set by the `image` field.
    -v, --volumes       Remove named volumes declared in the `volumes` section
                        of the Compose file and anonymous volumes
                        attached to containers.
    --remove-orphans    Remove containers for services not defined in the
                        Compose file

3

私はこの問題に半日を費やしました。その理由は、ボリュームが記録された場所を必ず確認するためです。

ボリューム:-api-data:/ src / pattern

しかし、実際には、この場所に変更したコードがありました。ただし、Dockerを更新しても、コードは変更されませんでした。

したがって、他の人のコードをチェックしていて、何らかの理由で更新していない場合は、これをチェックしてください。

したがって、一般的にこのアプローチは機能します。

docker-compose down

docker-composeビルド

docker-compose up -d


0

'up'コマンドのdocker-composeドキュメントには、最後の 'up'が実行されてからイメージが変更された場合にコンテナーが更新されることが明記されています。

サービスの既存のコンテナーがあり、コンテナーの作成後にサービスの構成またはイメージが変更された場合、docker-composeはコンテナーを停止して再作成することにより、変更を取得します(マウントされたボリュームを保持します)。

したがって、「stop」、「pull」、「up」の順に使用することで、イメージが更新されたコンテナーを除いて、実行中のコンテナーのボリュームが失われる問題を回避できます。

私は現在このプロセスを実験しており、まもなくこのコメントに私の結果を含めます。


docker

0

Docker構成構成がファイルにある場合は、以下を実行するだけです。

docker-compose -f appName.yml down && docker-compose -f appName.yml pull && docker-compose -f appName.yml up -d


-3

次のコマンドを使用して最新の画像を取得しています

sudo docker-compose down -rmi all

sudo docker-compose up -d

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