Прочитав статью «Запуск команд Docker в конвейерах Bitbucket», я придумал этот пример конвейера, который пытаюсь построить для репозитория Python.
image: python:3.10-slim
pipelines:
branches:
'**':
- step:
name: Test Docker Commands
runs-on:
- 'self.hosted'
- 'docker'
- 'linux'
services:
- docker
script:
- docker version
definitions:
services:
docker:
memory: 2048
Но я получаю следующую ошибку:
bash: docker: command not found
Я также пытался добавить export DOCKER_BUILDKIT=1
, но улучшений не было.
Есть ли что-то, что я упускаю или неправильно понимаю?
image: python:3.10-slim
Внутри образа Python нет команды Docker. Вам необходимо установить его внутри образа или использовать образ docker:cli.
См. dind
— документацию «docker-in-docker», см. изображения и теги докера docker.hub. См. документацию по изображениям конвейеров Bitbucket по умолчанию, см. https://hub.docker.com/r/atlassian/default-image/.
В Bitbucket Pipelines двоичный файл Docker CLI монтируется с помощью «службы докеров» support.atlassian.com/bitbucket-cloud/docs/…, поэтому вы можете использовать любое изображение, кроме docker:dind
Нет, я не согласен. Служба докеров запускает другой контейнер в той же сети докеров. Он создает второй контейнер, к которому можно получить доступ по IP-адресу сети. Затем служба Docker запускает демон Docker, который прослушивает команды Docker. Подключены сертификаты демона Docker. Невозможно «монтировать» исполняемые файлы (надежно), например команду docker
, из-за несовместимости стандартных библиотек между контейнерами. См. services:
в docker-compose.yml, который работает аналогичным образом. Возможно, services:
в gitlab-ci.yml имеет лучшую документацию.
Это не Docker Compose и не GitLab CI. Если вы прочитали документацию, на которую я ссылался, то поймете, как это работает в мире Bitbucket Pipelines. Бинарный файл Docker статически связан, поэтому проблем с несовместимостью библиотек нет.
Привет. Возможно, вы правы, и я, возможно, прав. Для выполнения статически связанного исполняемого файла по-прежнему требуется glibc. -slim image alpine linux с musl, выполнение двоичного файла которого завершится неудачно с сообщением от компоновщика об отсутствии такого файла или каталога при попытке найти ld.so . Да, вы дали ссылку на документацию, но это пример использования. Это ссылка support.atlassian.com/bitbucket-cloud/docs/…. Есть один способ решить наши разногласия – будьте любезны доказать свою правоту.
@N1ngu Пожалуйста, опубликуйте вывод findmnt
и mount
изнутри контейнера, работающего с services:
. Я очень сомневаюсь, что исполняемый файл docker
смонтирован, и это меня сбивает с толку. Если он установлен, будет отображаться mount
. В общем, я всегда рад оказаться неправым, пожалуйста, сделайте это. После переосмысления это bash:
печать no such file or directory
сообщения. Это сообщение подтверждает правильность этого ответа. Пожалуйста, докажите, что это неправильно. Можете ли вы воспроизвести сообщение об ошибке из ОП? Команда docker
доступна в образе Atlassian по умолчанию, поэтому она работает в документации.
извините, прошло несколько лет после того, как я потерял доступ к организации Bitbucket, поэтому я не могу отладить ни одно из этих доказательств. Но (1) я никогда не использовал изображение Atlassin по умолчанию, поэтому в документации оно работает не поэтому; (2) Я не смог воспроизвести сообщение об ошибке OP, потому что проблема связана с их автономными бегунами, чего никогда не произойдет в моих или облачных бегунах (3) Сообщение об ошибке OP не доказывает правильность этого ответа; (4) да, монтирование двоичного файла docker казалось странным, когда я начинал, но это работало, общие бегуны не показывали, как было создано задание, но каналы записывают параметр --mount=.../docker:...bin/docker !
Давайте продолжим обсуждение в чате.
Я нашел решение своей проблемы. Было две основные проблемы:
Спасибо, @N1ngu, за то, что указал мне правильное направление!
Трубопровод выглядит просто отлично. Это должно просто сработать. Я бы посоветовал вам проверить, правильно ли ваши автономные бегуны монтируют механизм докера в вашем контейнере, когда запрашивается служба докера.