Моя проблема:
Я хочу сохранить образ докера как артефакт в реестре Amazon EC2, созданный упаковщиком (и доступный)
Мои ограничения: сборка должна запускаться Bitbucket Pipelines. Поэтому шаги сборки необходимо выполнять либо в самом Bitbucket Pipelines, либо в экземпляре / контейнере AWS EC2.
Это связано с тем, что не все машины разработки обязательно имеют разрешения / пакеты для сборки из своей локальной среды. Я хочу, чтобы эти образы создавались только в результате автоматизированного процесса CI.
Что я пробовал:
Используя Packer, я могу создавать AMI удаленно. И я могу создавать образы Docker с помощью Packer (созданный локально и удаленно отправленный в Amazon ECR).
Однако конвейер Bitbucket, который уже выполняет шаги сборки в контейнере докера, не имеет доступа к процессу docker daemon 'docker run'.
Ошибка, которую я получаю в Bitbucket Pipelines:
+ packer build ${BITBUCKET_CLONE_DIR}/build/pipelines_builder/template.json
docker output will be in this color.
==> docker: Creating a temporary directory for sharing data...
==> docker: Pulling Docker image: hashicorp/packer
docker: Using default tag: latest
docker: latest: Pulling from hashicorp/packer
docker: 88286f41530e: Pulling fs layer
...
...
docker: 08d16a84c1fe: Pull complete
docker: Digest: sha256:c093ddf4c346297598aaa13d3d12fe4e9d39267be51ae6e225c08af49ec67fc0
docker: Status: Downloaded newer image for hashicorp/packer:latest
==> docker: Starting docker container...
docker: Run command: docker run -v /root/.packer.d/tmp/packer-docker426823595:/packer-files -d -i -t hashicorp/packer /bin/bash
==> docker: Error running container: Docker exited with a non-zero exit status.
==> docker: Stderr: docker: Error response from daemon: authorization denied by plugin pipelines: Command not supported..
==> docker: See 'docker run --help'.
==> docker:
Build 'docker' errored: Error running container: Docker exited with a non-zero exit status.
Stderr: docker: Error response from daemon: authorization denied by plugin pipelines: Command not supported..
See 'docker run --help'.
==> Some builds didn't complete successfully and had errors:
--> docker: Error running container: Docker exited with a non-zero exit status.
Stderr: docker: Error response from daemon: authorization denied by plugin pipelines: Command not supported..
See 'docker run --help'.
==> Builds finished but no artifacts were created.
Следующая цитата говорит обо всем (взято из ссылки ):
Другие команды, такие как docker run, в настоящее время запрещены по соображениям безопасности в нашей общей инфраструктуре сборки.
Итак, я знаю, почему происходит следующее. Это ограничение, с которым я столкнулся. Я понимаю, что мне нужно найти альтернативу.
Возможное решение. Единственное решение, которое я могу придумать на данный момент, - это конвейер Bitbucket, использующий изображение с установленными terraform и ansible, содержащее следующее:
ansible-local:
- terraform apply (spins up an instance/container from AMI with ansible and packer installed)
ansible-remote (к указанному выше экземпляру)
- clone devops repo with packer build script on it
- выполнить команду сборки упаковщика (команда сборки зависит от ansible, сборка создает образ реестра контейнера ec2)
ансибль-местный
- terraform destroy
Является ли вышеупомянутое решение жизнеспособным вариантом? Есть ли альтернативы? Может ли Packer не запускать команды и выполнять фиксацию из контейнера, запущенного удаленно в ECS?
Моим долгосрочным решением будет использование конвейеров битбакетов только для запуска лямбда-функций в AWS, которые будут запускать контейнеры в нашем реестре контейнеров EC2 и выполнять сборки там. Больше контроля, и мы можем заставить разработчиков запускать лямбда-функции со своих машин (с большим количеством индивидуальных динамических переменных).