Jak uzyskać komponowanie dokerów, aby zawsze odtwarzać kontenery ze świeżych zdjęć?

198

Moje obrazy dokerów są zbudowane na serwerze Jenkins CI i są przekazywane do naszego prywatnego rejestru Docker. Moim celem jest zapewnienie środowiskom kompozytu dokującego, które zawsze rozpoczynają pierwotnie zbudowany stan obrazów.

Obecnie używam docker-compose 1.3.2, a także 1.4.0 na różnych komputerach, ale wcześniej używaliśmy również starszych wersji.

Zawsze korzystałem z docker-compose pull && docker-compose up -dpoleceń, aby pobrać świeże obrazy z rejestru i uruchomić je. Wierzę, że moje preferowane zachowanie działało zgodnie z oczekiwaniami do pewnego momentu, ale od tego czasu docker-compose upzaczęło ponownie uruchamiać wcześniej zatrzymane pojemniki zamiast uruchamiać pierwotnie zbudowane obrazy za każdym razem.

Czy istnieje sposób na pozbycie się tego zachowania? Czy w ten sposób może być podłączony do pliku konfiguracyjnego docker-compose.yml, aby nie polegał na „nie zapominaniu” czegoś w wierszu poleceń przy każdym wywołaniu?

ps. Oprócz znalezienia sposobu na osiągnięcie mojego celu, chciałbym również dowiedzieć się nieco więcej o tle tego zachowania. Myślę, że podstawową ideą Dockera jest zbudowanie niezmiennej infrastruktury. Obecne zachowanie kompilowania dokerów wydaje się po prostu kolidować z tym podejściem ... czy brakuje mi tutaj niektórych punktów?

Kristof Jozsa
źródło

Odpowiedzi:

232

docker-compose up --force-recreatejest jedną z opcji, ale jeśli używasz go do CI, zacznę kompilację, docker-compose rm -faby zatrzymać i usunąć kontenery i woluminy (a następnie postępuj zgodnie z pull i up).

Oto, czego używam:

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

Powodem odtworzenia pojemników jest zachowanie wszelkich woluminów danych, które mogłyby zostać użyte (a także dzieje się upto znacznie szybciej).

Jeśli robisz CI, nie chcesz tego, więc po prostu usunięcie wszystkiego powinno dać ci to, czego chcesz.

Aktualizacja: użycie, up --buildktóre zostało dodane w docker-compose1.7

dnephin
źródło
1
Tak, właściwie to właśnie robię w CI. Nie jestem pewien, dlaczego o tym nie wspomniałem ...
Adrian Mouat,
@dnephin docker-compose run -dnie istnieje? Chcesz powiedzieć docker-compose up -dnie?
Guillaume Vincent
2
jeśli biegniesz, docker-compose pullzanim docker-compose rm -fmożesz zaoszczędzić jeszcze więcej czasu
stephanlindauer
2
Co robi flaga -d na końcu?
David J. Davis,
3
„-d Tryb
odłączony
135

Jedynym rozwiązaniem, które działało dla mnie, było polecenie:

docker-compose build --no-cache

Spowoduje to automatyczne pobranie świeżego obrazu z repozytorium i nie będzie używać wersji pamięci podręcznej, która jest wstępnie zbudowana z parametrami, których wcześniej używałeś.

davidbonachera
źródło
1
Ponadto w systemie Windows 10 może pomóc ustawić serwer DNS w ustawieniach z Automatyczny na Naprawiony lub z Naprawiony na Automatyczny.
qräbnö
2
Pracowałem dla mnie w budynku OS X z doker-comopse w wersji 2.
RoboBear,
1
Pracował w oknie dokowanym OS X.
HelloWorld,
55

Według obecnej oficjalnej dokumentacji istnieje skrót, który zatrzymuje i usuwa kontenery, sieci, woluminy i obrazy utworzone przez up, jeśli są już zatrzymane lub częściowo usunięte itd., Zrobi to samo:

docker-compose down

Następnie, jeśli masz nowe zmiany w swoich obrazach lub Dockerfiles, użyj:

docker-compose build --no-cache

Wreszcie:docker-compose up

Jednym poleceniem: docker-compose down && docker-compose build --no-cache && docker-compose up

Victor Timoftii
źródło
2
docker-compose build --no-cachejest potrzebny tylko wtedy, gdy w Dockerfiles nastąpią zmiany.
Victor Timoftii,
Rzeczywiście, Victor. Dzięki! Pomyślałem, że jest to również konieczne po aktualizacji modułu / aplikacji, która jest uruchamiana podczas uruchamiania kontenera. W takich przypadkach przed uruchomieniem docker-compose upnależy odbudować usługi docker-compose build.
ivanleoncz
18

Możesz przejść --force-recreatedo docker compose up, który powinien użyć świeżych pojemników.

Myślę, że powodem ponownego użycia pojemników jest zachowanie wszelkich zmian podczas projektowania. Zauważ, że Compose robi coś podobnego z woluminami, które będą również występować między odtwarzaniem kontenerów (odtworzony kontener zostanie dołączony do woluminów swojego poprzednika). Może to być pomocne, na przykład, jeśli używasz kontenera Redis jako pamięci podręcznej i nie chcesz stracić pamięci podręcznej za każdym razem, gdy dokonasz niewielkiej zmiany. W innych przypadkach jest to po prostu mylące.

Nie wierzę, że istnieje sposób na wymuszenie tego z pliku tworzenia.

Prawdopodobnie koliduje z niezmiennymi zasadami infrastruktury. Kontrargumentem jest prawdopodobnie to, że (jeszcze) nie używasz tworzenia wiadomości. Ponadto nie jestem pewien, czy zgadzam się, że niezmienna infra jest podstawową ideą Dockera, chociaż z pewnością jest to dobry przypadek użycia / zaletą sprzedaży.

Adrian Mouat
źródło
Dziękuję za odpowiedź. Myślę, że naprawdę przydatne byłoby wymuszenie go na poziomie konfiguracji, np. wymusić go dla kontenera bazy danych i domyślnie wyłączyć odtwarzanie dla kontenerów aplikacji.
Kristof Jozsa
8
--force-recreatenie działa dla mnie ... Obraz nie jest wyświetlany, mimo że dostępna jest nowsza wersja ...
lisak
1
@lisak Nigdy nie mówiłem, że pociąga za sobą nowe zdjęcia. Tak nie jest. Po prostu uruchamia nowe kontenery przy użyciu dowolnego obrazu dostępnego lokalnie. Będziesz musiał uruchomić ściąganie dokerów ręcznie.
Adrian Mouat,
2
docker-compose up --build

LUB

docker-compose build --no-cache
flgn
źródło
1
Jeśli to możliwe, postaraj się podać dodatkowe wyjaśnienie zamiast samego kodu. Takie odpowiedzi wydają się być bardziej przydatne, ponieważ pomagają członkom społeczności, a zwłaszcza nowym programistom, lepiej zrozumieć uzasadnienie rozwiązania i mogą pomóc w zapobieganiu konieczności odpowiedzi na dalsze pytania.
Rajan
-10
$docker-compose build

Jeśli pojawi się coś nowego, zostanie odbudowany.

Mathias Asberg
źródło