Примечание
Продвижение в 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»