2015-07-16 5 views
96

У меня есть docker-compose.yml файл, который содержит 4 контейнера: Redis, Postgres, API, работникКак перезапустить один контейнер с докер-Compose

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

ответ

134

Это очень просто: с помощью команды:

docker-compose restart worker 

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

docker-compose restart -t 30 worker 

Вот и все!

+3

для меня это сработало, но общий вопрос, если это разрешено здесь: означает «рестарт» позаботиться о связанных контейнеров и обновления/и т.д./хосты или не «перезагрузка» вообще меняет любые IP-адреса? – michabbb

+0

Контейнеры связаны по имени и, как правило, единственным IP-адресом, о котором вам нужно беспокоиться, является внешний IP-адрес узла док-станции (обычно 192.168.99.100).Там, где могут возникнуть проблемы, если вы, скажем, перезапустите контейнер базы данных, к которому подключены другие контейнеры. Зависимые контейнеры должны быть достаточно упругими, чтобы повторно подключаться. –

+0

OP заявляет, что ему необходимо «перезапустить его, чтобы применить изменения». Согласно документам команды 'docker-compose restart' НЕ будут применены никакие изменения. «Если вы вносите изменения в конфигурацию' docker-compose.yml', эти изменения не отражаются после выполнения этой команды ». Поэтому используйте 'docker-compose up -d -build'. https://docs.docker.com/compose/reference/restart/ – featherbelly

6

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

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

+0

не работает - новые изменения в coker-compose.yml не были применены к перезапуску – jlee

9

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

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

Если вам нужны изменения для применения к сборке, вы можете легко выполнить 'docker-compose up -d -build', и он будет перестраивать все и перезапускать любые измененные контейнеры. Сначала нет необходимости в остановке, с простоями и отдельными командами создания и запуска. – BMitch

+0

Да, если вы хотите перезапустить все службы, но OP только хочет перезапустить одну услугу, а не перезапустить остальные. – Jeff

+1

См. Ответ, который я опубликовал, в примере 'up' только воссоздает контейнер, который был изменен и поэтому необходим перезапуск. – BMitch

56

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

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

docker-compose up -d --build 

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

docker-compose pull 

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

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

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 
+0

Это интересно, но может ли он использоваться вместе с опцией '-no-cache'? Скажем, я добавил что-то в свой 'package.json' и вам нужно re'RUN npm install', но сам' Dockerfile' не изменился. –

+1

@augustinriedinger Если ваш входной файл изменен и вы включаете его с помощью команды 'COPY', который автоматически разбивает кеш. – BMitch

+0

Я не получил часть 'COPY' вашего комментария. Действительно, редактирование 'Dockerfile' будет работать, но это грязный хак, тем более, что файл отслеживается в' git' ... –

Смежные вопросы