имя контейнера докера иногда уже используется после остановки - PullRequest
0 голосов
/ 19 июня 2019

У меня есть задание Jenkins, которое за одну ночь заменяет док-контейнер на последнее изображение. Обычно это работает, но иногда это происходит с ошибкой:

docker: Error response from daemon: Conflict. The container name "/demo-api" is already in use by container

В задании Jenkins используется следующее:

docker stop demo-api
./api_container.sh

api_container.sh делает docker pull и docker run --name demo-api -t -d --rm.

Однако, когда я ssh включаюсь утром после сбоя и запускаю docker ps, контейнер больше не работает, поэтому похоже, что он в конце концов остановится, просто не вовремя для команды docker run, которая пытается его запустить с новым изображением.

Вопросы
Команда docker stop не блокируется, пока не вернется?
Должен ли я обращаться с этим по-другому в моем сценарии работы Дженкинс?
Я также видел команду docker wait. Должен ли я использовать это тоже в моем сценарии?

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

Уверен, у вас есть условия гонки здесь. Стоп вернется до того, как --rm вступит в силу. Так что это гонка между --rm, обработанным движком, и сценарием api_container.sh.

Я бы использовал явный docker rm, чтобы избежать гонки. Обратите внимание, что docker rm может завершиться с ошибкой в ​​зависимости от того, где --rm находится в процессе его обработки, и я бы справился с этим с помощью короткого сна, чтобы быть уверенным, что это сделано.

docker stop demo-api
docker rm demo-api || sleep 5
./api_container.sh

Или вы можете переключиться на docker rm -f, который убьет и удалит контейнер за один шаг. Вероятно, то, что вы действительно хотите, и менее подвержено ошибкам, но может оставить тома в плохом состоянии, если приложение умирает изящно.

docker rm -f demo-api
./api_container.sh
0 голосов
/ 19 июня 2019

docker stop остановит ваш контейнер.

В этой команде можно найти все остановленные контейнеры.

docker ps --filter "status=exited

Полученная вами ошибка говорит The container name "/demo-api" is already in use by container

Это означает, что уже существует контейнер с именем demo-api, что верно, поскольку остановка контейнера Docker не удалит этот контейнер, и это имя контейнера будет существовать.

Все, что вам нужно сделать, это

либо

Запустите команду docker run без указания опции --name, которая дает имя вашему контейнеру demo-api. Так что каждый раз, когда ваш скрипт извлекает и запускает контейнер, он получает новое случайное имя контейнера.

OR

Если вы хотите сохранить имя контейнера demo-api, а не останавливать контейнер с помощью docker stop Просто удалите контейнер все вместе docker rm -f demo-api

UPDATE

Я только что видел, как вы обновили свой вопрос.

Остановка контейнера, который был запущен с использованием опции --rm, должна удалить это контейнер все вместе.

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

Пока что вы можете попробовать запустить скрипт в цикле while и проверить, происходит ли это во время этого запуска.

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

#!/bin/bash
i=20
while [ $i -gt 0 ]
do
docker stop demo-api
docker pull alpine
docker run --name demo-api -t -d --rm alpine sh
i=$((i - 1))
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...