web-dev-qa-db-ja.com

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

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

常に新しいイメージからコンテナを再作成するようにdocker-composeを取得する方法? これは私の問題に似ているように見えますが、提供されているソリューションはどれも私にとってはうまくいきません本番サーバーで使用できるソリューションを探していますが、再起動する前にすべてのコンテナを削除する必要はありません(データ損失の可能性はありますか?)。作成したいのは、変更されたイメージの新しいバージョンを検出し、それらを取得してから、それらの新しいイメージでサービスを再起動することだけです。

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

dockerバージョン:1.11.2 docker-composeバージョン:1.7.1 OS:docker-toolboxを使用してCentOS 7とOS X 10.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サービスを構築するために必要なDockerfileのみであるコンピューター上のフォルダーで、私が取得する出力はレジストリでタグ付けされているか表示されている最新バージョン番号ではありません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の意図した動作ですか?つまり、実稼働サーバー上でも、upを再度実行する前に、常にdocker-compose rm -fを実行する必要がありますかまたは、私はここで穀物に対して何かをしているのですか?それがなぜ機能していないのですか?

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

43
Jens Wegar

この質問を締めくくるために、うまくいったように思われることは実際に実行されている

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

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

18
Jens Wegar

レジストリ(例:dockerハブ)の:latestタグに最新バージョンを使用していることを確認するには、最新のタグも再度プルする必要があります。変更された場合、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/

31
stephanlindauer

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

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

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

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

20
Abhishek Galoda

これは、7-8ドッカーの実稼働システムで発生します。私が本番で働いた別の解決策は、実行することでした

docker-compose down
docker-compose up -d

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

これは、変更されたコンテナごとにダウン+アップという夢を解決するものではありません(順次、ダウン時間を短縮します)が、コンテナを強制的に「アップ」させるように機能します。

3
Danku

オプション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
0
Slavik Muz

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

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

したがって、 'stop'に続いて 'pull'、次に 'up'を使用することにより、当然ながら、イメージが更新されたコンテナーを除き、実行中のコンテナーのボリュームの損失の問題を回避する必要があります。

現在、このプロセスを試していますが、このコメントに結果をすぐに記載します。

0
Paul Pritchard