Рубрики
Uncategorized

Докер остановить все процессы на Действия GitHub

Как показать все контейнеры, остановитесь и удалите их на действиях GitHub. Теги с CICD, Docker, промежуточным.

Примечание

Продвижение в CI/CD могут быть сложными из-за отсутствия промежуточных учебных пособий/блогов относительно этой части развития. Легко найти простой «Как настроить ваш рабочий процесс с минимальными рабочими работами», которые на самом деле не помогают в проектах на уровне производства. Интересно, почему.

Проблема

У меня есть Docker в одном из проектов, над которыми я работаю, и хотел интегрировать Ci/Cd. Поэтому я пошел с действиями GitHub V2 и начал проверять, как обрабатывать Docker и Docker-Compose на действиях GitHub. Несколько различий между действиями GitHub и другими поставщиками рабочего процесса развертывания (например, Circleci, Travis), но я бы сказал, что главное разница в Действия .

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

Пример

Подумайте, что у нас есть эти контейнеры докеров

$ docker ps -a

CONTAINER ID        IMAGE                        COMMAND                CREATED              STATUS              PORTS               NAMES
4c01db0b339c        ubuntu:12.04                 bash                   17 seconds ago       Up 16 seconds       3300-3310/tcp       webapp
d7886598dbe2        crosbymichael/redis:latest   /redis-server --dir    33 minutes ago       Up 33 minutes       6379/tcp            redis,webapp/db

Обходной путь

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

docker stop ubuntu:12.04 crosbymichael/redis:latest
docker rm ubuntu:12.04 crosbymichael/redis:latest

Это довольно хорошо, если у вас есть несколько контейнеров, и вы уверены, что другие контейнеры Docker не существуют. Но это предположение, что я не хочу взять, а также, он глючит, если я добавлю новый контейнер позже и забудьте добавить его в сценарий рабочего процесса.

Общее решение

Некоторые из вас могут быть кричать уже с этой святой командой Grail.

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

Это в основном останавливается/удаляет все существующие контейнерные процессы, независимо от того, какие их идентификаторы. Отлично! Теперь нажмите это на наш Github Удаленный и дождитесь, что Github Action Runner, чтобы закончить сценарий рабочего процесса, но затем бегун показывает красный крест ❌ Создание не удалось с ошибкой о Docker Stop требует параметра Отказ

Действия GitHub используют $ Чтобы позвонить в переменные (например github_repository ), так что это ищет переменную под названием Докер PS ... Но это неопределено, так как я не установил его как переменную среды в рабочем процессе. Мы могли бы избежать действий по умолчанию $ с другим $ так команда становится

docker stop $$(docker ps -a -q)

Однако это также не сработало, я немного посмотрел и не нашел хорошего объяснения для этого, но проводил слишком много времени на этом. Поэтому я переехал, в конце концов, остановка докеров не главная задача для всего рабочего процесса.

Рабочее решение

После приоритетов моих задач для проекта я решил найти другое решение и быстро преодолеть эту проблему. Только тогда я наткнулся на этот кусок сценария Bash, который я не видел раньше.

ids=$(docker ps -a -q)
for id in $ids
do
 echo "$id"
 docker stop $id && docker rm $id
done

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

GitHub Actions Runner пропускал это без каких-либо ошибок, чтобы я был рад узнать новый трюк и перейти с другими задачами, чтобы закончить рабочий процесс.

Оригинал: «https://dev.to/saulsilver/docker-stop-all-processes-on-github-actions-533j»