Як перезапустити один контейнер з docker-compose


333

У мене є docker-compose.ymlфайл, який містить 4 контейнери: redis, postgres, api, Working

Під час розвитку працівника мені часто потрібно перезапустити його, щоб застосувати зміни. Чи є якийсь хороший спосіб перезапустити контейнер (наприклад worker) без перезавантаження інших контейнерів?


2
docker-compose -f
docker-compose.yml

Відповіді:


398

Це дуже просто: Використовуйте команду:

docker-compose restart worker

Ви можете встановити час очікування зупинки перед тим, як вбити контейнер (у секундах)

docker-compose restart -t 30 worker

Зауважте, що це перезапустить контейнер, але без його відновлення. Якщо ви хочете застосувати свої зміни, а потім перезапустити, погляньте на інші відповіді.


3
для мене це працювало, але загальне питання, якщо тут дозволено: чи «перезапуск» піклується про зв’язані контейнери та оновлює / etc / hosts чи не «перезапуск» не змінює IP-адреси взагалі?
michabbb

Контейнери пов'язані по імені і, як правило, єдиним IP-адресою, про який потрібно турбуватися, є зовнішній IP-хост докера (як правило, 192.168.99.100). Де можуть виникнути проблеми, якщо ви, скажімо, перезавантажте контейнер бази даних, до якого підключені інші контейнери. Залежні контейнери повинні бути досить стійкими, щоб знову підключитися.
Райан Кімбер

20
ОП заявляє, що йому потрібно "перезапустити його, щоб застосувати зміни". Згідно з документами, docker-compose restartкоманди НЕ застосовують жодних змін. "Якщо ви внесете зміни у свою docker-compose.ymlконфігурацію, ці зміни не відображаються після запуску цієї команди." Тому використовуйте docker-compose up -d --build. docs.docker.com/compose/reference/restart
featherbelly

5
nb, worker - це ім’я, яке надається службі у файлі yaml, і не те, що ви бачите під час запускуdocker ps -a
worc

2
Ця інша відповідь набагато краще stackoverflow.com/a/39501539/292408 , оскільки restartне застосовує змін, навіть якщо ви вже виконали, docker-compose build <container name>і це непрацююча / неправильна відповідь.
Ілля Лінн

170

Інші відповіді на перезапуск одного вузла знаходяться на цілі, docker-compose restart worker. Це відмовиться від цього контейнера, але не буде містити жодних змін, навіть якщо ви його переобладнали окремо. Ви можете вручну stop, rm, createі start, але є набагато простіше методу.

Якщо ви оновили свій код, ви можете виконати збірку та перезавантаження в один крок за допомогою:

docker-compose up --detach --build

Це спочатку відновить ваші зображення з будь-якого зміненого коду, що швидко, якщо не буде змін, оскільки кеш використовується повторно. І тоді він лише замінює змінені контейнери. Якщо завантажені зображення нерівні, ви можете передувати вищевказаній команді:

docker-compose pull

Щоб завантажити спочатку будь-які змінені зображення (контейнери не буде перезапущено, доки не запустите команду, як upописано вище). Робити початкову зупинку зайве.

І щоб зробити це лише для однієї послуги, виконайте команду "вгору" або "витягнення" за допомогою служб, які ви хочете вказати, наприклад:

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

Це цікаво, але чи можна його використовувати разом із -no-cacheваріантом? Скажіть, я додав щось у своє package.jsonі мені потрібно переосмислити, RUN npm installале Dockerfileсам не змінився
Августин Рідінгер

2
@augustinriedinger Якщо ваш вхідний файл змінено, і ви додасте його до COPYкоманди, це автоматично порушить кеш.
BMitch

1
@augustinriedinger дякую. Я мобільний, тому я не бачу пов'язаних питань. З кроків у вашому запитанні ви вже повинні мати COPYкоманду у своєму Dockerfile. git pullОновить файл package.json і кеш збірки буде ламатися , коли докер бачить скопіювати в інший файл.
BMitch

1
Спасибі не знали про таку поведінку! Я використовував ADDзамість цього, COPYале, мабуть, остання є найкращою практикою, тому я піду для цього!
Августин Рідінгер

1
@augustinriedinger ADDматиме такий самий результат, як і COPYна бюсті кешу, але (як це пропонується у посиланні кращих практик) більшості не потрібні додаткові можливості, тому я навіть не намагаюся згадувати про це.
BMitch

28

Щоб перезапустити послугу зі змінами, виконайте наведені нижче дії.

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

10
Якщо вам потрібні зміни, які слід застосувати до збірки, ви можете легко зробити це, docker-compose up -d --buildі воно відновить усе і перезапустить будь-які змінені контейнери. Не потрібно спочатку зупинятись із простоєм, а також окремі команди створення та запуску.
BMitch

4
Так, якщо ви хочете перезапустити всі сервіси, але ОП хоче лише перезапустити одну службу, а не перезапустити інші
Jeff

3
Дивіться відповідь, яку я розмістив, у прикладі, upзаповіт лише відтворив змінений контейнер і тому потребував перезавантаження.
BMitch

18

Наступна команда

docker-compose restart worker

просто зупиниться та запустить контейнер. тобто не завантажуючи змін з docker-compose.xml

STOP схожий на сплячку в ПК. Отже, зупинка / запуск не буде шукати змін, внесених у файл конфігурації. Для перезавантаження з рецепту контейнера (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

+1, велике спасибі! Для rmрядка варіант -fстає зручним (без підказок) і з поточним докером createі startоб'єднується як up(тож у нас є 3 команди, а не 4), а для upпараметра -dкорисний (виконання знаходиться у фоновому режимі).
astrowalker

10

Перезапустіть службу за допомогою докер-композиційного файлу

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 -f docker-compose.yml restart worker


4
не працює - нові зміни до кокер-compose.yml не застосовуються при перезапуску
jlee

3

Перезавантажте контейнер

Якщо ви хочете просто перезапустити контейнер:

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 (як альтернатива, ви можете шукати пакунки з автоматичним перезавантаженням на обраній вами мові). Додавання цього повинно усунути необхідність перезавантаження контейнера щоразу після зміни коду, замість того, щоб перезавантажувати процес всередині.


1

Тут йдеться про відображення зміни у файлі docker-compose.yml.

Але що робити, якщо я хочу включити зміни, внесені мною в свій код, і я вважаю, що це стане можливим лише за допомогою перебудови зображення і що я роблю з наступними командами

1. зупинка контейнера докер

docker stop container-id

2. видалення контейнера докер

docker rm container-id

3. видалення зображення докера

docker rmi image-id

4. знову складіть контейнер

docker-compose up container-name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.