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


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

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

5 153

5 ответов:

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

docker-compose restart worker

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

docker-compose restart -t 30 worker

вот и все !

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

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

docker-compose up -d --build

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

docker-compose pull

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

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

docker-compose up -d --build worker

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

$ time docker-compose -f docker-compose.nginx-proxy.yml up -d --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

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

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

простая команда ' docker 'ничего не знает о контейнере' worker'. Используйте такую команду

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

следующую команду

docker-compose restart worker

будет просто остановить и запустить контейнер. т. е. без загрузки каких-либо изменений из docker-compose.xml

стоп похож на спящий режим в ПК . Следовательно, 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