2016-08-13 12 views
17

środowiskoDocker Swarm Service - aktualizacja siła najnowszego obrazu już uruchomiony

  • doker 1,12
  • clusted na Ubuntu 16.04

Czy istnieje sposób, aby wymusić toczenia aktualizacji do usługi doker roju działa już, jeśli aktualizacja usługi nie zmienia żadnych parametrów, ale obraz centrum dokującego został zaktualizowany?

Przykład: I wdrożone usługi:

docker service create --replicas 1 --name servicename --publish 80:80 username/imagename:latest 

Moje proces budowania uaktualnili najnowszy obraz na piaście Döcker Teraz chcę ciągnąć ostatni raz.

Próbowałem trwania:

docker service update --image username/imagename:latest servicename 

Kiedy śledzę ten proces, doker nie ciągnąć ostatni, myślę, że zakłada, że ​​ponieważ chciałem najnowsze i doker już wyciągnął obraz: ostatni to nie ma nic do zrobienia.

Jedyne, co mam do wykonania to usunięcie usługi service name i ponowne wdrożenie.

+0

To nie działa. Stworzyłem problem dla Docker: https://github.com/docker/docker/issues/26978 Obejście polega na dodaniu bezsensownych metadanych lub informacji o wdrożeniu itp., Takich jak uprzednio skomentowane:> Mogłem wywołać aktualizację aktualizacyjną, korzystając z kontenera etykiety. Dodałem --container-label-add deploy = "1.0.1". Dlatego za każdym razem, gdy zmieniam etykietę, każda usługa wykonuje ciągnięcie i ponowne wdrożenie usługi. - longday 14 sierpnia o 15:53 ​​ –

Odpowiedz

11

Tylko dla przyszłości:

Docker 1.13 Dodano --force flagę service update:

--force: Siła aktualizację nawet jeśli żadne zmiany wymagają

Użyj go jak w:

docker service update --force service_name 
+2

Używam Docker Swarm (17.04.0-ce) na Azure i po prostu używając '--force' nie aktualizuję obrazu do najnowszej wersji. Muszę dodać tekst do znacznika obrazu: 'aktualizacja usługi docker --image register.co/image:[email protected]:109ca ... service'. Następnie aktualizuje obraz do najnowszego wypychania. Czy czegoś brakuje? – manixx

+1

IIRC, jeśli twoja usługa jest skonfigurowana do używania określonego skrótu, aktualizacja będzie kontynuowała ciągnięcie tego samego obrazu. Możesz spróbować 'docker service update --force --image register.co/image service', aby usunąć przypinanie digest, i od tego momentu pojedyncze' --force' powinno wystarczyć. – Aisamu

+0

Dzięki za odpowiedź! Zrobiłem kilka ciężkich testów i nie miałem szczęścia z flagą '--force'. Próbowałem prywatnego rejestru Docker (przy użyciu 'rejestru: 2') i oficjalnego Docker Hub (myśl, że rejestr może być przyczyną). Nigdy nie podałem żadnego skrótu (w "usłudze tworzenia" lub "aktualizacji usługi") podczas aktualizacji, ale Docker zawsze używał skrótu. 'service inspect' również pokazał skrót i automatyczne wycofywanie również go rozważało. Może to oczekiwane zachowanie (testowane na '17.05.0-ce, build 89658be')? – manixx

6

Docker nie pobierze automatycznie pobrania z DockerHub (lub prywatnego rejestru) obrazu: tag, który już masz lokalnie.

Jeśli wykonano ręczne wyciągnięcie przed zdjęciem docker service update, lub zdjęcie zostało usunięte lokalnie, zrobiłoby to.

Można również łańcuch polecenia:

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

można uniknąć tego scenariusza przez tagowanie zdjęć i numerycznie przy użyciu zaktualizowanego tag. username/imagename:1.1.0

+0

Próbowałem wykonać aktualizację pull i service na menedżerze bez powodzenia. Następnie próbowano wykonać ciągnięcie każdego węzła i aktualizację usługi od menedżera bez powodzenia. – longday

+3

Udało mi się wywołać aktualizację kroczącą, korzystając z etykiet kontenera. Dodałem --container-label-add deploy = "1.0.1". Dlatego za każdym razem, gdy zmieniam etykietę, każda usługa wykonuje ciągnięcie i ponowne wdrożenie usługi. – longday

2

Co mogę zrobić, to

  1. pociągnąć pierwszy obraz
  2. Uruchom komendę aktualizacja z nową etykietą datownika

Update Service doker --container-label-add last_deployed = $ (data -u +% Y-% m-% dT% H:% M:% S) nazwa_kontenera

3

Można użyć obrazu ID zamiast username/imagename:latest tak:

docker service update --image \ 
$(docker inspect --type image --format '{{.Id}}' username/imagename:latest) \ 
servicename 

Ale w tym przypadku wszystkie węzły muszą ciągnąć ten obrazek przed aktualizacją serwisu. W przeciwnym razie kontenery będą aktualizowane tylko w tych węzłach, w których istnieje obraz o takim identyfikatorze. Na szczęście węzły, które nie mają tego obrazu, zatrzymają swoje kontenery, więc nie ma nic złego, jeśli niektóre węzły nie będą w stanie pobrać nowej wersji obrazu.

UPDATE: czy można użyć obrazu strawienia następująco:

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 powraca obraz strawić który zawiera unikalny hash obrazu generowanego przez rejestru v2. Dlatego obraz musi zostać pobrany z rejestru, inaczej digest nie będzie dostępny.

Korzystanie z digest nie pozwala na pobieranie obrazów na wszystkich węzłach (obrazy z określonym skrótem będą automatycznie pobierane z rejestru na niezbędnych węzłach). Ale musisz pobrać świeżą wersję obrazu raz na węźle menedżera przed aktualizacją usługi.

BTW, ostatnia droga będzie domyślnym since Docker 1.13

Powiązane problemy