Как перезапустить один контейнер с помощью докеры

У меня есть файл docker-compose.yml, который содержит 4 контейнера: redis, postgres, api, worker

Во время разработки рабочего я часто должен перезапустить его, чтобы применить изменения. Есть ли хороший способ перезапустить контейнер (например, worker) без перезапуска других контейнеров?

Ответ 1

Это очень просто: используйте команду:

docker-compose restart worker

Вы можете установить время ожидания остановки перед уничтожением контейнера (в секундах)

docker-compose restart -t 30 worker

Обратите внимание, что это перезапустит контейнер, но не перестраивает его. Если вы хотите применить свои изменения и затем перезапустить, взгляните на другие ответы.

Ответ 2

Другие ответы на перезапуск одного узла находятся на целевом, docker-compose restart worker. Это отразит этот контейнер, но не будет включать никаких изменений, даже если вы перестроили его отдельно. Вы можете вручную stop, rm, create и start, но намного проще методы.

Если вы обновили свой код, вы можете выполнить сборку и перезагрузку за один шаг:

docker-compose up --detach --build

Это сначала восстановит ваши изображения из любого измененного кода, что быстро, если нет изменений, так как кэш используется повторно. И тогда он только заменяет измененные контейнеры. Если ваши загруженные изображения устарели, вы можете добавить команду выше:

docker-compose pull

Для того, чтобы загрузить любые измененные изображения первого (контейнеры не будет перезапущен, пока вы не запустите команду как и up выше). Делать начальную остановку не нужно.

И чтобы сделать это только для одного сервиса, выполните команду up или pull с сервисами, которые вы хотите указать, например:

docker-compose up --detach --build worker

Вот краткий пример первого варианта, Dockerfile структурирован так, чтобы часто изменяющиеся части кода оставались ближе к концу. Фактически, требования устанавливаются отдельно для pip install поскольку этот файл редко изменяется. А поскольку контейнеры nginx и redis были обновлены, они не были перезапущены. Общее время всего процесса составило менее 6 секунд:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s

Ответ 3

Чтобы перезапустить службу с изменениями, выполните следующие шаги:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker

Ответ 4

Следующая команда

docker-compose restart worker

просто ОСТАНОВИТЕ и НАЧНИТЕ контейнер. т.е. без загрузки каких-либо изменений из docker-compose.xml

STOP похож на спящий режим в ПК. Следовательно, stop/start не будет искать какие-либо изменения, внесенные в файл конфигурации. Для перезагрузки из рецепта контейнера (docker-compose.xml) нам нужно удалить и создать контейнер (аналогично перезагрузке ПК)

Так что команды будут следующими

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation

Ответ 5

Простая команда "докер" ничего не знает о контейнере "worker". Используйте команду, подобную этой

docker-compose -f docker-compose.yml restart worker

Ответ 6

Перезапустите Сервис с помощью docker-compose file

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

Вариант использования # 1: если COMPOSE_FILE_NAME - docker-compose.yml а служба - рабочая

docker-compose restart worker

Вариант использования № 2: если имя файла sample.yml и служба работает

docker-compose -f sample.yml restart worker

По умолчанию docker-compose ищет docker-compose.yml если мы запускаем команду docker-compose, иначе у нас есть флаг для указания конкретного имени файла с помощью -f [FILE_NAME].yml

Ответ 7

Перезапустить контейнер

Если вы хотите просто перезапустить свой контейнер:

docker-compose restart servicename

Думайте об этой команде как о "просто перезапустите контейнер по его имени", что эквивалентно команде docker restart.

Примечание:

  1. Если вы изменили переменные ENV, они не будут обновляться в контейнере. Вы должны остановить это и начать снова. Или с помощью одной команды docker-compose up обнаружит изменения и заново создаст контейнер.

  2. Как уже упоминалось многими, если вы изменили сам файл docker-compose.yml, простой перезапуск не применит эти изменения.

  3. Если вы копируете свой код внутри контейнера на этапе сборки (в Dockerfile с помощью команд ADD или COPY), каждый раз, когда код изменяется, вам придется перестраивать контейнер (docker-compose build).

Соотношение с вашим кодом

docker-compose restart должен прекрасно работать, если ваш код отображает путь в контейнер с помощью директивы тома в docker-compose.yml следующим образом:

services:

  servicename:
    volumes:
      - .:/code

Но я бы порекомендовал использовать прямую перезагрузку кода, которая, вероятно, предоставляется выбранной вами средой в режиме DEBUG (в качестве альтернативы вы можете искать пакеты с автоматической перезагрузкой на выбранном вами языке). Добавление этого должно устранить необходимость перезапускать контейнер каждый раз после изменения кода, вместо этого перезагружая процесс внутри.