Как перезапустить один контейнер с помощью docker-compose
у меня есть docker-compose.yml
файл, содержащий 4 контейнера: redis, postgres, api, worker
во время разработки worker мне часто нужно перезапустить его, чтобы применить изменения. Есть ли хороший способ перезапустить контейнер (например,worker
) без перезапуска других контейнеров?
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