Как перезапустить один контейнер с помощью докеры
У меня есть файл 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
.
Примечание:
Если вы изменили переменные ENV, они не будут обновляться в контейнере. Вы должны остановить это и начать снова. Или с помощью одной команды docker-compose up
обнаружит изменения и заново создаст контейнер.
Как уже упоминалось многими, если вы изменили сам файл docker-compose.yml
, простой перезапуск не применит эти изменения.
Если вы копируете свой код внутри контейнера на этапе сборки (в Dockerfile
с помощью команд ADD
или COPY
), каждый раз, когда код изменяется, вам придется перестраивать контейнер (docker-compose build
).
Соотношение с вашим кодом
docker-compose restart
должен прекрасно работать, если ваш код отображает путь в контейнер с помощью директивы тома в docker-compose.yml
следующим образом:
services:
servicename:
volumes:
- .:/code
Но я бы порекомендовал использовать прямую перезагрузку кода, которая, вероятно, предоставляется выбранной вами средой в режиме DEBUG (в качестве альтернативы вы можете искать пакеты с автоматической перезагрузкой на выбранном вами языке). Добавление этого должно устранить необходимость перезапускать контейнер каждый раз после изменения кода, вместо этого перезагружая процесс внутри.