удаление существующих образов докера из EC2 с помощью Jenkins - PullRequest
1 голос
/ 04 ноября 2019

Мне нужно запустить несколько контейнеров из изображений, представленных в AWS ECR. Поскольку мне нужно автоматизировать это, я использую Jenkins.

У меня есть 4 репозитория ECR, как только новая версия образа появится в этомрепозиторий, мое задание jenkins сработает и создаст новый контейнер. Так как код микросервиса меняется, и я получаю новый образ в ECR, мне нужно удалить старый контейнер и запустить новый на том же порту.

Я использую Jenkins для отправки файла или выполнения команд через SSH. Затем я предоставляю команды, подобные приведенным ниже

   aws ecr get-login --no-include-email > login.sh
   bash login.sh
   docker pull 944198216610.dkr.ecr.us-east-1.amazonaws.com/demo- 
     docker:latest
   docker run -d -p 8081:80 944198216610.dkr.ecr.us-east- 
        1.amazonaws.com/demo-docker:latest

Теперь проблема в том, что когда я получаю новое изображение, мне нужно остановить работу более раннего контейнера, и для этого мне нужен идентификатор контейнера. Я не знаю, чтобы получить идентификатор контейнера здесь, чтобы остановить контейнер. Любая помощь в этом высоко ценится.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

, чтобы получить контейнеры, которые вы можете использовать:

docker ps -q --filter "ancestor=944198216610.dkr.ecr.us-east- 
        1.amazonaws.com/demo-docker:latest"

, чтобы удалить их:

docker rm -f $(docker ps -q --filter "ancestor=944198216610.dkr.ecr.us-east- 
        1.amazonaws.com/demo-docker:latest")

вы можете добавить -a к docker ps, чтобы также удалить не запущенные контейнеры

ancestor Фильтрует контейнеры, которые совместно используют данное изображение в качестве предка. Выражается как image-name [: tag], id изображения или image @ digest

1 голос
/ 04 ноября 2019

Ответ уже дан, но одна важная вещь, которую я никогда не буду предлагать удалить контейнер, используя

docker rm -f

, который отправляет SIGKILL напрямую без льготного периода.

Лучший способ сделать это - сначала остановить контейнер , а затем удалить контейнер. Сначала отправляется SIGTERM , затем, после льготного периода, SIGKILL .

Также, если вы не используете ECS, то достаточно жестко закодированного имени, так как вы не запускаете оба контейнера одновременно, поэтому

docker run --rm --name my_container -d -p 8081:80 944198216610.dkr.ecr.us-east-1.amazonaws.com/demo-docker:latest

, поэтому во время развертывания все, что вам нужно docker stop my_container, остановится иконтейнер также освободит имя, так что вы можете снова развернуть его с тем же именем.

docker run --rm --name my_container -d -p 8081:80 944198216610.dkr.ecr.us-east-1.amazonaws.com/demo-docker:latest
...