2016-06-07 96 views
16

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.

+0

'docker-compose up -d --force-recreate' nie działa? – BMitch

+0

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

+0

--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 –

Odpowiedz

8

Aby zamknąć to pytanie, co wydawało się, że pracował rzeczywiście działa

docker-compose stop 
docker-compose rm -f 
docker-compose -f docker-compose.yml up -d 

tj usuń pojemniki przed ponownym uruchomieniem up.

Należy pamiętać o tym, że w takim przypadku pojemniki z danymi są usuwane również po uruchomieniu rm -f. Aby temu zapobiec określić jednoznacznie każdy pojemnik do usunięcia:

docker-compose rm -f application nginx php 

Jak powiedziałem w moim pytaniu, nie wiem, czy jest to prawidłowy proces. Ale wydaje się, że działa to w naszym przypadku użycia, więc dopóki nie znajdziemy lepszego rozwiązania, zastosujemy to.

+0

Co zrobić, jeśli chcesz przywrócić poprzednią wersję kontenera? Spłucz, powtórz? – EightyEight

+1

Nie próbowałem, ale tak, zakładam tyle. Ponieważ wersję kontenera należy zdefiniować w docker-compose.yml (np. Myimage: 2.0.1), jeśli chcesz wycofać, zaktualizuj docker-compose.yml do wersji, którą chcesz przywrócić (np. 2.0 .0) i ponownie wykonać ten sam proces powtórzenia płukania. –

+0

Jeśli chcę przywrócić i po prostu przywrócić zatwierdzenie, niech budować hub docker, a następnie czekać na updater, aby go podnieść. prawdopodobnie nie jest to najbardziej wyszukany system, ale działa w przypadku moich wolnych projektów. – stephanlindauer

8

Aby upewnić się, że używasz najnowszej wersji dla swojego znacznika :latest z rejestru (np. Koncentratora dokującego), musisz również pobrać najnowszy tag ponownie. w przypadku zmiany, diff zostanie pobrane i uruchomione ponownie po docker-compose up.

więc byłoby to do zrobienia:

docker-compose stop 
docker-compose rm -f 
docker-compose pull 
docker-compose up -d 

przykleiłem to na obrazie że biegnę do rozpoczęcia Döcker-komponować i upewnić się, że obrazy bądź na bieżąco: https://hub.docker.com/r/stephanlindauer/docker-compose-updater/

2

Widziałem to w naszym 7-8 systemie doków doków. Innym rozwiązaniem, że pracował dla mnie w produkcji było uruchomić

docker-compose down 
docker-compose up -d 

usuwa pojemniki i zdaje się „w górę” tworzyć nowe od najnowszego obrazu.

To jeszcze nie rozwiąże mojego marzenia o obniżaniu + na KAŻDY zmieniony pojemnik (seryjnie, mniej przestojów), ale działa, aby zmusić "do góry" do aktualizacji pojemników.

+0

'docker-compose down' afaik usuwa również wszelkie pojemniki objętości danych powiązane z uruchomionymi kontenerami. Nie ma problemu, jeśli woluminy danych zawierają tylko te elementy, które można ponownie utworzyć z działającego kontenera. Należy jednak zachować ostrożność, jeśli woluminy zawierają dane, które chcesz zachować. –

-1

Dokumentacja doker-komponować dla komendy 'up' wyraźnie stwierdza, że ​​aktualizuje pojemnik powinien obraz zostać zmienione od ostatniego „w górę” przeprowadzono:

Jeśli istnieją pojemniki na usługi, a konfiguracja lub obraz usługi został zmieniony po utworzeniu kontenera, dokowanie-komponowanie podnosi zmiany przez zatrzymanie i odtworzenie kontenerów (zachowanie zamontowanych woluminów).

Więc za pomocą „stop”, a następnie „pull”, a następnie „w górę” w związku z tym powinno to uniknąć problemów utraconych tomów dla pojemników do biegania, z wyjątkiem oczywiście, do pojemników, których zdjęcia zostały zaktualizowane.

Obecnie eksperymentuję z tym procesem i wkrótce zawrzemy moje wyniki w tym komentarzu.

1

aby uzyskać najnowsze zdjęcia używać Döcker-Compose budować --pull

używam poniżej polecenia, które jest naprawdę 3 w 1

"docker-compose down && docker-compose build --pull && docker-compose up -d" 

To polecenie spowoduje zatrzymanie usługi pociągnąć najnowsze obrazu, a następnie uruchom usługi.