環境
サービスの更新でパラメーターが変更されていないが、Dockerハブイメージが更新されている場合、既に実行されているdocker swarmサービスにローリング更新を強制する方法はありますか?
例:サービスをデプロイしました:
docker service create --replicas 1 --name servicename --publish 80:80 username/imagename:latest
ビルドプロセスにより、Dockerハブの最新のイメージが更新され、最新のイメージを再度取得したいと思います。
私は実行しようとしました:
docker service update --image username/imagename:latest servicename
このプロセスに従うと、dockerは最新のものをプルしません。最新のものが必要であり、dockerは既にimage:latestをプルしているので、何もすることはないと想定しています。
唯一の回避策は、サービスservicenameを削除して再デプロイすることです。
将来の参考のために:
Docker 1.13は--force
フラグを service update
に追加しました:
--force
:変更が必要ない場合でも強制的に更新
次のように使用します。
docker service update --force service_name
Dockerは、既にローカルにあるimage:tagに対してDockerHub(またはプライベートレジストリ)からのプルを自動的に実行しません。
docker service update
の前に手動でプルを実行した場合、またはローカルでイメージを削除した場合は、そうなります。
コマンドを連鎖させることもできます:
docker pull image:tag && docker service update --image username/imagename:latest servicename
画像に数値でタグを付け、更新されたタグを使用することで、このシナリオを回避できます。 username/imagename:1.1.0
次のようなusername/imagename:latest
の代わりに画像IDを使用できます。
docker service update --image \
$(docker inspect --type image --format '{{.Id}}' username/imagename:latest) \
servicename
ただし、この場合、すべてのノードがこのイメージをプルする必要がありますサービス更新前。それ以外の場合、コンテナは、そのようなIDのイメージが存在するノードでのみ更新されます。幸いなことに、このイメージを持たないノードはコンテナを停止するため、一部のノードがイメージの新しいバージョンを取得できない場合、何も悪いことはありません。
[〜#〜] update [〜#〜]:または、次のように画像ダイジェストを使用できます。
docker service update --image \
$(docker inspect --type image --format '{{index .RepoDigests 0}}' username/imagename:latest) \
servicename
docker inspect --type image --format '{{index .RepoDigests 0}}' IMAGE
は、レジストリv2によって生成された画像の一意のハッシュを含む画像ダイジェストを返します。したがって、画像はレジストリから取得する必要があります。そうしないと、ダイジェストを利用できません。
ダイジェストを使用すると、すべてのノードでイメージをプルすることはできません(指定されたダイジェストを持つイメージは、必要なノードのレジストリから自動的にプルされます)。ただし、サービスを更新する前に、マネージャーノードでイメージの新しいバージョンを一度プルする必要があります。
ところで、最後の方法はデフォルトになります Docker 1.13以降
Dockerサービスイメージを更新する場合は、docker service update --image myimage:tag servicename
を実行するだけです。例えばdocker service update --image traefik:1.7.5 traefik_proxy
また、myimage:latest
タグを使用しないことにより、パッチリリースではなく、最新の更新されたメジャー/マイナーリリースに意図せずに更新されないようにします。
参照: https://github.com/moby/moby/issues/30951#issuecomment-279479589
私がやることは
docker service update --container-label-add last_deployed = $(date -u +%Y-%m-%dT%H:%M:%S)service_name_or_id