Jak odbudować kontener dokerów w docker-compose.yml?

218

Istnieje zakres usług zdefiniowanych w docker-compose.yml. Te usługi zostały uruchomione. Muszę odbudować tylko jeden z nich i uruchomić go bez dodatkowych usług. Uruchamiam następujące polecenia:

docker-compose up -d # run all services
docker-compose stop nginx # stop only one. but it still running !!!
docker-compose build --no-cache nginx 
docker-compose up -d --no-deps # link nginx to other services

Na koniec mam stary pojemnik nginx. Nawiasem mówiąc, komponowanie dokerów nie zabija wszystkich działających kontenerów!

Juklia
źródło
4
docker-compose up --build
Jinna Balu,

Odpowiedzi:

233

dokowanie-skomponuj

$docker-compose up -d --no-deps --build <service_name>

--no-deps - Nie uruchamiaj powiązanych usług.

--build - Buduj obrazy przed uruchomieniem kontenerów.

denov
źródło
19
docker-compose build service1 service2 --no-cache wykonuje tę pracę lepiej ( github.com/docker/compose/issues/1049 ). Miałem problem z buforowanymi kontenerami, które zostały zbudowane przed użyciem docker-compose up -d --no-deps --build <service_name>
evgpisarchik
33
@evgpisarchik Rozkazy nieco się rozchodzą, powinno byćdocker-compose build --no-cache service1 service2
Matthew Wilcoxson
181

Z docker-compose 1.19 up

docker-compose up --build --force-recreate --no-deps [-d] [<service_name>..]

Bez jednego lub większej liczby service_nameargumentów wszystkie kontenery zostaną odbudowane

Z menu pomocy

Options:
    -d, --detach        Detached mode: Run containers in the background,
                        print new container names. Incompatible with
                        --abort-on-container-exit.
    --no-deps           Don't start linked services.
    --force-recreate    Recreate containers even if their configuration
                        and image haven't changed.
    --build             Build images before starting containers.
Harlem Wiewiórka
źródło
4
Jestem zdezorientowany, jak to odpowiada na pytanie. Jak odbudowujemy tylko jeden pojemnik?
Duncan Jones
11
Możesz odbudować tylko jeden kontener, dołączając jego nazwę na końcu polecenia. docker-compose up -d --force-recreate --build container_name
HarlemSquirrel
Chwileczkę, to odtwarza pojemnik , nie jest to równoważne z build --no-cacheopcją, chyba że opis polecenia jest całkowicie niepoprawny
Slav
67

To powinno rozwiązać twój problem:

docker-compose ps # lists all services (id, name)
docker-compose stop <id/name> #this will stop only the selected container
docker-compose rm <id/name> # this will remove the docker container permanently 
docker-compose up # builds/rebuilds all not already built container 
ArgonQQ
źródło
12
jeśli chcesz stopi rmwszystkie kontenery, możesz użyć polecenia docker-compose down. Twoje rozwiązanie jest lepsze, jeśli chcesz się go tylko pozbyć.
hirowatari
To rozwiązanie dobrze pasuje do konfiguracji, w której nie chcesz zatrzymać całej aplikacji
dokera
Musiałem faktycznie uruchomić docker-compose build <id/name>wcześniej, upaby odbudować zmieniony plik Docker.
Vajk Hermecz
49

Jak napisał @HarlemSquirrel, jest to najlepsze i myślę, że właściwe rozwiązanie.

Ale, aby odpowiedzieć na konkretny problem PO, powinno to być coś w rodzaju następującego polecenia, ponieważ nie chce ponownie tworzyć WSZYSTKICH usług w docker-compose.ymlpliku, ale tylko nginxjedną:

docker-compose up -d --force-recreate --no-deps --build nginx

Opis opcji:

Options:
  -d                  Detached mode: Run containers in the background,
                      print new container names. Incompatible with
                      --abort-on-container-exit.
  --force-recreate    Recreate containers even if their configuration
                      and image haven't changed.
  --build             Build images before starting containers.
  --no-deps           Don't start linked services.
Slavik Meltser
źródło
9

Może te kroki nie są całkiem poprawne, ale podoba mi się to:

zatrzymaj tworzenie dokera: $ docker-compose down

usuń pojemnik: $ docker system prune -a

rozpocznij tworzenie dokera: $ docker-compose up -d

Sergey Ivchenko
źródło
4

Po prostu użyj:

docker-compose build [yml_service_name]

Zastąp [yml_service_name]swoją nazwą usługi w docker-compose.ymlpliku. Możesz użyć, docker-compose restartaby upewnić się, że zmiany zostaną wprowadzone. Możesz użyć, --no-cacheaby zignorować pamięć podręczną.

FarhadMohseni
źródło
2

Problemem jest:

$ docker-compose stop nginx

nie działa (mówiłeś, że nadal działa). Jeśli mimo to zamierzasz go odbudować, możesz spróbować go zabić:

$ docker-compose kill nginx

Jeśli nadal nie działa, spróbuj zatrzymać go bezpośrednio za pomocą okna dokowanego:

$ docker stop nginx

lub usuń to

$ docker rm -f nginx

Jeśli to nadal nie działa, sprawdź swoją wersję dokera, może być konieczne uaktualnienie.

Może to być błąd, możesz sprawdzić, czy pasuje do twojego systemu / wersji. Oto kilka, na przykład: https://github.com/docker/docker/issues/10589

https://github.com/docker/docker/issues/12738

Aby obejść ten problem, możesz spróbować zabić proces.

$ ps aux | grep docker 
$ kill 225654 # example process id
użytkownik2707671
źródło
1

Dla mnie pobrałem tylko nowe zależności z Docker Hub z obydwoma --no-cachei --pull(które są dostępne dla docker-compose build.

# other steps before rebuild
docker-compose build --no-cache --pull nginx # rebuild nginx
# other steps after rebuild, e.g. up (see other answers)
kmindi
źródło
0
docker-compose stop nginx # stop if running
docker-compose rm -f nginx # remove without confirmation
docker-compose build nginx # build
docker-compose up -d nginx # create and start in background

Niezbędne jest usunięcie pojemnika za pomocą rm. Bez usuwania Docker uruchomi stary pojemnik.

Nex
źródło
-9

Tylko:

$ docker-compose restart [yml_service_name]
ALEXANDER GOMEZ HIGUITA
źródło
4
to nie zbuduje nowych zmian. z instrukcji - jeśli wprowadzisz zmiany w konfiguracji dokera-compose.yml, zmiany te nie zostaną odzwierciedlone po uruchomieniu tego polecenia.
denov