何が間違っているのかわかりませんが、システムから古いコンテナを完全に削除しない限り、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
を実行して、新しいイメージを本番で開始します。誰かがこれに関するヒントを持っているか、この種のセットアップのベストプラクティスチュートリアルを指すことができれば、それも非常に高く評価されます。
この質問を締めくくるために、うまくいったように思われることは実際に実行されている
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
私の質問で言ったように、これが正しいプロセスかどうかはわかりません。しかし、これは私たちのユースケースではうまくいくようですので、より良い解決策が見つかるまでこれを使います。
レジストリ(例: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/
最新のイメージを取得するには、docker-compose build --pullを使用します
私は実際に3つの1である以下のコマンドを使用します
"docker-compose down && docker-compose build --pull && docker-compose up -d"
このコマンドは、サービスを停止し、最新のイメージを取得してからサービスを開始します。
これは、7-8ドッカーの実稼働システムで発生します。私が本番で働いた別の解決策は、実行することでした
docker-compose down
docker-compose up -d
これによりコンテナが削除され、最新のイメージから新しいコンテナが「作成」されます。
これは、変更されたコンテナごとにダウン+アップという夢を解決するものではありません(順次、ダウン時間を短縮します)が、コンテナを強制的に「アップ」させるように機能します。
オプション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
'up' コマンドのdocker-composeドキュメントには、最後の 'up'が実行されてからイメージが変更された場合にコンテナーが更新されることが明確に記載されています。
サービスの既存のコンテナがあり、コンテナの作成後にサービスの構成またはイメージが変更された場合、docker-compose upは停止して変更を取得しますコンテナを再作成します(マウントされたボリュームを保持します)。
したがって、 'stop'に続いて 'pull'、次に 'up'を使用することにより、当然ながら、イメージが更新されたコンテナーを除き、実行中のコンテナーのボリュームの損失の問題を回避する必要があります。
現在、このプロセスを試していますが、このコメントに結果をすぐに記載します。