Nie wiem, co robię źle, ale po prostu nie mogę uzyskać docker-compose up
, aby użyć najnowszego obrazu z naszego rejestru bez wcześniejszego usuwania starych pojemników z system całkowicie. Wygląda na to, że kompozytor używa wcześniej uruchomionego obrazu, mimo że funkcja dokowania-kreślenia przyciągnęła nowszy obraz.Skąd pobrać doker-komponować, aby użyć najnowszego obrazu z repozytorium
Spojrzałem na How to get docker-compose to always re-create containers from fresh images?, który wydawał się być podobny do mojego problemu, ale żadne z dostarczonych rozwiązań tam nie działa, ponieważ szukam rozwiązania, które mogę wykorzystać na serwerze produkcyjnym i tam nie chcę usunąć wszystkie pojemniki przed ponownym uruchomieniem (możliwe uszkodzenie danych?). Chciałbym komponować tylko w celu wykrycia nowej wersji zmienionych obrazów, przeciągnąć je, a następnie ponownie uruchomić usługi z tymi nowymi obrazami.
Stworzyłem prosty projekt testowy, w którym jedynym celem jest uzyskanie wersji nr do zwiększenia w każdej nowej kompilacji. Wersja nr jest wyświetlana, gdy przeglądam serwer Nginx, który jest tworzony (działa zgodnie z oczekiwaniami na miejscu).
doker wersja: 1.11.2 wersja doker-komponować: 1.7.1 OS: testowany zarówno na CentOS 7 i OS X 10.10 użyciu Döcker-Toolbox
Moja doker-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 i uruchomić następujące budować i oznaczyć zdjęcie
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
to wydaje się, że robi to, co ma być, odkąd ge t nowy tag wersji w naszym repozytorium za każdym razem, gdy kompilacja zostanie zakończona, a wersja nr zostanie podważona.
Gdybym teraz uruchomić
docker-compose pull && docker-compose -f docker-compose.yml up -d
w folderze na swoim komputerze, gdzie treść jest tylko doker-compose.yml a niezbędne Dockerfiles zbudować usług nginx i PHP, wyjście mogę to nie najnowszy numer wersji, który został oznaczony w rejestrze lub jest wyświetlany w docker-compose.yml (0.1.8), ale wersja wcześniejsza niż 0.1.7. Jednak wyjście polecenia ciągnącej sugerowałoby, że nowa wersja obrazu było naciągane:
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 uruchomić komendę docker-compose up
mogę dostać nową wersję do pokaż się na ekranie zgodnie z oczekiwaniami.
Czy to zamierzone zachowanie dokera-komponowania? tj. czy zawsze powinienem wykonać docker-compose rm -f
przed ponownym uruchomieniem up
, nawet na serwerach produkcyjnych? Czy robię coś przeciwko ziarnu tutaj, dlatego nie działa?
Celem jest zbudowanie procesu budowania i tworzenie oznakowanych wersji obrazów potrzebnych w pliku docker-compose.yml, przeniesienie ich do naszego prywatnego rejestru, a następnie "zwolnienie do etapu produkcyjnego" w celu skopiowania docker-compose.yml do serwera produkcyjnego i uruchom docker-compose pull && docker-compose -f docker-compose.yml up -d
dla nowego obrazu, aby rozpocząć produkcję. Jeśli ktoś ma na ten temat wskazówki lub może wskazać samouczek dotyczący najlepszych praktyk dla tego rodzaju konfiguracji, który również byłby bardzo doceniany.
'docker-compose up -d --force-recreate' nie działa? – BMitch
Aby uniknąć ryzyka utraty danych podczas usuwania/odtwarzania kontenerów, użyj hosta lub nazwanego woluminu. Wygląda na to, że już używasz woluminów hosta dla innych kontenerów. Pusty pierwszy wolumin nazwany zostanie zainicjowany wraz z zawartością woluminu obrazu przy pierwszym użyciu. – BMitch
--force-recreated nie działało, nie :(Używam woluminów do przechowywania danych, więc część utraty danych może nie jest istotna, ale nadal jestem zakłopotany, jeśli chodzi o robienie docker-compose rm przed ponownym uruchomieniem kontenerów. Czy nie powinno się wydawać polecenia "up", szczególnie przy odtwarzaniu "force", aby zwrócić uwagę na nowy obraz, a zamiast tego używać go? To źle, że musiałem wymusić usunięcie na serwerze produkcyjnym –