Nie wiem, co robię źle, ale po prostu nie mogę docker-compose up
użyć najnowszego obrazu z naszego rejestru bez uprzedniego całkowitego usunięcia starych kontenerów z systemu. Wygląda na to, że redagowanie używa wcześniej uruchomionego obrazu, mimo że docker-compose pull pobrał nowszy obraz.
Przyjrzałem się, jak sprawić, by docker-compose zawsze odtwarzał kontenery ze świeżych obrazów? który wydawał się być podobny do mojego problemu, ale żadne z dostarczonych tam rozwiązań nie działa dla mnie, ponieważ szukam rozwiązania, którego mogę użyć na serwerze produkcyjnym i tam nie chcę usuwać wszystkich kontenerów przed ich uruchomieniem ponownie (możliwa utrata danych?). Chciałbym tylko komponować, aby wykryć nową wersję zmienionych obrazów, wyciągnąć je, a następnie ponownie uruchomić usługi z tymi nowymi obrazami.
Stworzyłem do tego prosty projekt testowy, w którym jedynym celem jest uzyskanie numeru wersji do zwiększania przy każdej nowej kompilacji. Numer wersji jest wyświetlany, jeśli przejdę do utworzonego serwera nginx (działa to zgodnie z oczekiwaniami lokalnie).
wersja docker: 1.11.2 wersja docker-compose: 1.7.1 System operacyjny: przetestowano zarówno na CentOS 7, jak i OS X 10.10 przy użyciu docker-toolbox
Mój 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
na naszym serwerze jenkins uruchamiam następujące polecenie, aby zbudować i otagować obraz
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
wydaje się, że robi to, co powinno, ponieważ dostaję tag nowej wersji w naszym repozytorium za każdym razem, gdy kompilacja się kończy, a wersja nr została zderzona.
Jeśli teraz biegnę
docker-compose pull && docker-compose -f docker-compose.yml up -d
w folderze na moim komputerze, w którym zawartość zawiera tylko plik docker-compose.yml i niezbędne pliki Dockerfiles do zbudowania usług nginx i php, otrzymany wynik nie jest najnowszym numerem wersji, który został oznaczony w rejestrze lub jest pokazany w docker-compose.yml (0.1.8), ale wcześniejsza wersja, czyli 0.1.7. Jednak wynik polecenia pull sugerowałby, że została pobrana nowa wersja obrazu:
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
Tylko jeśli biegnę
docker-compose stop && docker-compose rm -f
a następnie uruchom docker-compose up
polecenie, czy nowa wersja pojawi się na ekranie zgodnie z oczekiwaniami.
Czy to zamierzone zachowanie docker-compose? tj. czy powinienem zawsze zrobić docker-compose rm -f
przed up
ponownym uruchomieniem , nawet na serwerach produkcyjnych? A może robię coś pod prąd i dlatego to nie działa?
Celem jest zbudowanie naszego procesu kompilacji i utworzenie oznaczonych wersji obrazów potrzebnych w pliku docker-compose.yml, przekazanie ich do naszego prywatnego rejestru, a następnie „wydanie do etapu produkcji”, aby po prostu skopiować plik docker-compose. yml na serwer produkcyjny i uruchom docker-compose pull && docker-compose -f docker-compose.yml up -d
nowy obraz, aby rozpocząć produkcję. Jeśli ktoś ma wskazówki na ten temat lub może wskazać samouczek najlepszych praktyk dla tego rodzaju konfiguracji, również byłby bardzo wdzięczny.
źródło
docker-compose up -d --force-recreate
nie działa?--force-recreate
kontenery nie są odtwarzane, może być konieczne zgłoszenie błędudocker-compose
. Pamiętaj, że użycie nowego obrazu oznaczałoby odtworzenie kontenera, co spowodowałoby jego usunięcie. A jeśli w tym procesie nie usuniesz żadnych woluminów określonych dla kontenerów, możesz uzyskać dość długą listę danych, których nigdy więcej nie użyjeszdocker volume ls -f dangling=true
. Więc twoja poprawka to pierwsza połowa tego, co docker-compose powinno dla ciebie zrobić.Odpowiedzi:
aby upewnić się, że używasz najnowszej wersji
:latest
tagu z rejestru (np. docker hub), musisz również ponownie pobrać najnowszy tag. w przypadku zmiany, plik różnicowy zostanie pobrany i uruchomionydocker-compose up
ponownie.więc to byłaby droga:
przykleiłem to do obrazu, który uruchamiam, aby rozpocząć docker-compose i upewnić się, że obrazy są aktualne: https://hub.docker.com/r/stephanlindauer/docker-compose-updater/
źródło
docker-compose pull && docker-compose up -d
wystarczy. Automatycznie sprawdza, czy uruchomione kontenery są nieaktualne, a jeśli tak jest, odtwarza je z najnowszymi obrazamiAby uzyskać najnowsze obrazy, użyj kompilacji docker-compose --pull
Używam poniższego polecenia, które jest naprawdę 3 w 1
docker-compose down && docker-compose build --pull && docker-compose up -d
To polecenie zatrzyma usługi, pobierze najnowszy obraz, a następnie uruchomi usługi.
źródło
docker-compose pull
aby zaktualizować obrazy dla usług z obrazem: zamiast wbudować: wdocker-compose.yml
czydocker-compose build --pull
zrobisz to?nginx uses an image, skipping
, używając kompilacji docker-compose --pull W ten sposób nie aktualizuje obrazów.Aby zamknąć to pytanie, to, co wydawało się działać, rzeczywiście działa
To znaczy usuń pojemniki przed
up
ponownym uruchomieniem .Robiąc to w ten sposób, należy pamiętać o tym, że kontenery woluminów danych są również usuwane, jeśli po prostu uruchomisz
rm -f
. Aby temu zapobiec, wyraźnie określam każdy kontener do usunięcia:Jak powiedziałem w swoim pytaniu, nie wiem, czy to jest właściwy proces. Ale wydaje się, że działa to w naszym przypadku użycia, więc dopóki nie znajdziemy lepszego rozwiązania, będziemy korzystać z tego.
źródło
Widziałem to w naszym systemie produkcyjnym 7-8 docker. Innym rozwiązaniem, które sprawdziło się na produkcji, było uruchomienie
usuwa to kontenery i wydaje się tworzyć nowe z najnowszego obrazu.
To jeszcze nie rozwiązuje mojego marzenia o obniżeniu + w górę za KAŻDY zmieniony kontener (seryjnie, mniej przestojów), ale działa, aby wymusić „w górę”, aby zaktualizować pojemniki.
źródło
docker-compose down
afaik usuwa również wszelkie kontenery woluminów danych połączone z uruchomionymi kontenerami. Nie ma więc problemu, jeśli woluminy danych zawierają tylko rzeczy, które można odtworzyć z uruchomionego kontenera. Należy jednak zachować ostrożność, jeśli woluminy zawierają dane, które chcesz zachować.down
usuwa domyślnie i aktualny dokument: kontenery, sieci i domyślne sieci. Dokument mówi: „Sieci i woluminy zdefiniowane jako zewnętrzne nigdy nie są usuwane”. Działa dla mnie z nazwanymi woluminami (i myślę, że dotyczy to również nazwanych sieci).Opcja
down
rozwiązania tego problemuUruchamiam mój plik tworzenia:
docker-compose -f docker/docker-compose.yml up -d
następnie usuwam wszystko za pomocą
down --rmi all
docker-compose -f docker/docker-compose.yml down --rmi all
źródło
Spędziłem z tym problemem pół dnia. Powodem było to, że koniecznie sprawdź, gdzie nagrano głośność.
Ale faktem jest, że w tym miejscu był kod, który zmieniliśmy. Ale podczas aktualizacji dockera kod się nie zmienił.
Dlatego jeśli sprawdzasz kod innej osoby iz jakiegoś powodu nie aktualizujesz, sprawdź to.
Generalnie więc to podejście działa:
źródło
Dokumentacja docker-compose dla polecenia „up” jasno stwierdza, że aktualizuje ono kontener w przypadku zmiany obrazu od ostatniego „up”:
Tak więc użycie „stop”, a następnie „pull”, a następnie „up” powinno w ten sposób uniknąć problemów z utraconymi wolumenami dla działających kontenerów, z wyjątkiem oczywiście kontenerów, których obrazy zostały zaktualizowane.
Obecnie eksperymentuję z tym procesem i wkrótce zamieszczę moje wyniki w tym komentarzu.
źródło
Jeśli konfiguracja docker compose znajduje się w pliku, po prostu uruchom:
źródło
Ale
nie działa ?
źródło
Używam następującego polecenia, aby uzyskać najnowsze obrazy
sudo docker-compose down -rmi all
sudo docker-compose up -d
źródło