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.
docker-compose up -d --force-recreate
nie działa?