web-dev-qa-db-ja.com

Docker Swarm Service-既に実行されている最新のイメージの強制更新

環境

  • ドッカー1.12
  • ubuntu 16.04に含まれています

サービスの更新でパラメーターが変更されていないが、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を削除して再デプロイすることです。

36
longday

将来の参考のために:

Docker 1.13は--forceフラグを service update に追加しました:

--force:変更が必要ない場合でも強制的に更新

次のように使用します。

docker service update --force service_name
33
Aisamu

Dockerは、既にローカルにあるimage:tagに対してDockerHub(またはプライベートレジストリ)からのプルを自動的に実行しません。

docker service updateの前に手動でプルを実行した場合、またはローカルでイメージを削除した場合は、そうなります。

コマンドを連鎖させることもできます:

docker pull image:tag && docker service update --image username/imagename:latest servicename

画像に数値でタグを付け、更新されたタグを使用することで、このシナリオを回避できます。 username/imagename:1.1.0

15
DevOps Dan

次のような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以降

7
renskiy

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

3
Pratik

私がやることは

  1. 最初に画像を引っ張ります
  2. 新しいタイムスタンプラベルを使用して更新コマンドを実行します

docker service update --container-label-add last_deployed = $(date -u +%Y-%m-%dT%H:%M:%S)service_name_or_id

3
getvivekv