Mam docker-compose.yml
plik, który zawiera 4 pojemniki: redis, postgres, api, pracownik
Podczas opracowywania pracownika często muszę go ponownie uruchamiać, aby zastosować zmiany. Czy istnieje dobry sposób na ponowne uruchomienie kontenera (np. worker
) Bez ponownego uruchamiania innych kontenerów?
docker
docker-compose
Bryan Chen
źródło
źródło
Odpowiedzi:
To bardzo proste: użyj polecenia:
Możesz ustawić czas oczekiwania na zatrzymanie przed zabiciem kontenera (w sekundach)
Pamiętaj, że spowoduje to ponowne uruchomienie kontenera, ale bez jego przebudowywania. Jeśli chcesz zastosować zmiany, a następnie uruchomić ponownie, spójrz na inne odpowiedzi.
źródło
docker-compose restart
polecenia NIE będą stosować żadnych zmian. „Jeśli wprowadzisz zmiany wdocker-compose.yml
konfiguracji, zmiany te nie zostaną odzwierciedlone po uruchomieniu tego polecenia.” Dlatego użyjdocker-compose up -d --build
. docs.docker.com/compose/reference/restartdocker ps -a
restart
nie stosuje zmian, nawet jeśli już uruchomiłeś adocker-compose build <container name>
i jest to niedziałająca / niepoprawna odpowiedź.Inne odpowiedzi na ponowne uruchomienie pojedynczego węzła są na celu,
docker-compose restart worker
. Spowoduje to odbicie tego kontenera, ale nie spowoduje żadnych zmian, nawet jeśli przebudujesz go osobno. Można ręczniestop
,rm
,create
, istart
, ale są znacznie łatwiejsze sposoby.Jeśli zaktualizowałeś kod, możesz wykonać kompilację i przeładować w jednym kroku za pomocą:
To najpierw odbuduje obrazy z dowolnego zmienionego kodu, co jest szybkie, jeśli nie ma żadnych zmian od ponownego użycia pamięci podręcznej. A następnie zastępuje tylko zmienione pojemniki. Jeśli pobrane obrazy są nieaktualne, możesz poprzedzić powyższe polecenie:
Aby najpierw pobrać zmienione obrazy (pojemniki nie zostaną ponownie uruchomione, dopóki nie uruchomisz polecenia takiego jak
up
powyżej). Wykonanie pierwszego zatrzymania nie jest konieczne.Aby to zrobić tylko w przypadku pojedynczej usługi, wykonaj polecenie w górę lub w dół, używając usług, które chcesz określić, np .:
Oto szybki przykład pierwszej opcji, Dockerfile ma strukturę, która utrzymuje często zmieniające się części kodu pod koniec. W rzeczywistości wymagania są pobierane osobno,
pip install
ponieważ plik ten rzadko się zmienia. A ponieważ kontenery nginx i redis były aktualne, nie zostały ponownie uruchomione. Całkowity czas całego procesu wynosił poniżej 6 sekund:źródło
-no-cache
opcją? Powiedzmy, że dodałem coś do siebiepackage.json
i muszę ponownie,RUN npm install
aleDockerfile
samo się nie zmieniłoCOPY
polecenie, spowoduje to automatyczne uszkodzenie pamięci podręcznej.COPY
polecenie w swoim Dockerfile.git pull
Zaktualizuje plik package.json i cache budować złamie gdy doker widzi kopiowanie w innym pliku.ADD
zamiast,COPY
ale najwyraźniej ta ostatnia jest najlepszą praktyką, więc pójdę po nią!ADD
będzie miał taki sam wynik jakCOPY
w przypadku awarii pamięci podręcznej, ale (jak sugeruje link do najlepszych praktyk) większość nie potrzebuje dodatkowych możliwości, więc nawet nie zawracam sobie tym głowy.Aby ponownie uruchomić usługę ze zmianami tutaj, wykonaj następujące kroki:
źródło
docker-compose up -d --build
a wszystko odbuduje i zrestartuje zmienione kontenery. Najpierw nie ma potrzeby zatrzymywania, z przestojami i osobnymi poleceniami tworzenia i uruchamiania.up
odtworzy tylko kontener, który został zmieniony i dlatego wymagał ponownego uruchomienia.Po poleceniu
po prostu ZATRZYMA i uruchomi pojemnik. tzn. bez ładowania żadnych zmian z pliku docker-compose.xml
STOP jest podobny do hibernacji na PC. Dlatego stop / start nie będzie szukał żadnych zmian dokonanych w pliku konfiguracyjnym. Aby ponownie załadować z receptury kontenera (docker-compose.xml), musimy usunąć i utworzyć kontener (analogicznie do ponownego uruchomienia komputera)
Więc polecenia będą następujące
źródło
rm
linii opcja-f
jest przydatna (bez monitu) i z bieżącym dokeremcreate
istart
jest scalana jakoup
(więc w sumie mamy 3 polecenia, a nie 4), a dlaup
opcji-d
jest przydatna (wykonanie jest w tle).Uruchom ponownie usługę z plikiem skompilowania dokera
Użyj przypadku nr 1: jeśli plik COMPOSE_FILE_NAME jest,
docker-compose.yml
a usługa jest pracownikiemPrzykład 2: jeśli nazwa pliku to
sample.yml
usługa jest pracownikiemDomyślnie docker-compose szuka,
docker-compose.yml
jeśli uruchomimydocker-compose
polecenie, w przeciwnym razie mamy flagę, za pomocą której można podać konkretną nazwę pliku-f [FILE_NAME].yml
źródło
Proste polecenie „dokera” nic nie wie o kontenerze „pracownika”. Użyj polecenia w ten sposób
docker-compose -f docker-compose.yml restart worker
źródło
Uruchom ponownie pojemnik
Jeśli chcesz ponownie uruchomić kontener:
docker-compose restart servicename
Pomyśl o tym poleceniu jako „po prostu uruchom ponownie kontener według jego nazwy”, co jest równoważne z
docker restart
poleceniu.Uwaga:
Jeśli zmieniłeś zmienne ENV, nie zostaną zaktualizowane w kontenerze. Musisz to zatrzymać i zacząć od nowa. Lub za pomocą pojedynczego polecenia
docker-compose up
wykryje zmiany i ponownie utworzy kontener.Jak wielu innych wspomniało, jeśli zmieniłeś
docker-compose.yml
sam plik, proste ponowne uruchomienie nie zastosuje tych zmian.Jeśli skopiujesz kod do kontenera na etapie kompilacji (przy
Dockerfile
użyciuADD
lubCOPY
poleceń), za każdym razem, gdy kod się zmieni, musisz odbudować kontener (docker-compose build
).Korelacja z twoim kodem
docker-compose restart
powinien działać idealnie dobrze, jeśli twój kod zostanie zmapowany do kontenera według dyrektywy woluminu w następującydocker-compose.yml
sposób:Ale zalecam użycie przeładowania kodu na żywo, który zapewne zapewniony jest przez wybrany przez ciebie framework w trybie DEBUG (alternatywnie możesz wyszukać pakiety automatycznego przeładowania w wybranym języku). Dodanie tego powinno wyeliminować potrzebę ponownego uruchamiania kontenera za każdym razem po zmianie kodu, zamiast przeładowywania procesu w środku.
źródło
Odpowiedzi tutaj mówią o odzwierciedleniu zmiany w pliku docker-compose.yml.
Ale co, jeśli chcę uwzględnić zmiany, które wprowadziłem w kodzie, i wierzę, że będzie to możliwe tylko poprzez odbudowę obrazu i że wykonam następujące polecenia
1. przystanek kontenera dokującego
2. usunięcie pojemnika dokera
3. usuwanie obrazu dokera
4. skomponuj pojemnik ponownie
źródło