Запустите сборку docker-build в .gitlab-ci.yml
У меня есть .gitlab-ci.yml
который содержит следующее:
image: docker:latest
services:
- docker:dind
before_script:
- docker info
- docker-compose --version
buildJob:
stage: build
tags:
- docker
script:
- docker-compose build
Но в ci-log
я получаю сообщение:
$ docker-compose --version
/bin/sh: eval: line 46: docker-compose: not found
Что я делаю неправильно?
Ответы
Ответ 1
EDIT Я добавил еще один ответ, предоставляющий минимальный пример конфигурации .gitlab-ci.yml, поддерживающей компоновку docker.
docker-compose
может быть установлен как пакет Python, который не поставляется с вашим изображением. Выбранное изображение даже не обеспечивает установку Python:
$ docker run --rm -it docker sh
/ # find / -iname "python"
/ #
Поиск Python дает пустой результат. Таким образом, вам нужно выбрать другое изображение, которое соответствует вашим потребностям и в идеале должно быть установлено докер-компоновкой или вы сами создаете его.
Выбранное изображение докера использует Alpine Linux. Вы можете использовать его в качестве основы для своего собственного изображения или сначала попробовать другой, если вы не знакомы с Alpine Linux.
У меня была такая же проблема, и я создал файл Docker в публичном репозитории GitHub и связал его с моей учетной записью Docker Hub и выбрал автоматическую сборку для создания моего изображения при каждом нажатии в репозиторий GitHub. Затем вы можете легко получить доступ к своим собственным изображениям с помощью GitLab CI.
Ответ 2
docker-compose теперь нужно больше dev-пакетов, что описано в их официальной документации. Это рекомендуемое решение, но оно меня не удовлетворяет... Слишком много пакетов, чтобы запустить его:
# .gitlab-ci.yml
image: docker
services:
- docker:dind
build:
script:
- apk add --no-cache py-pip python-dev libffi-dev openssl-dev gcc libc-dev make
- pip install docker-compose
- docker-compose up -d
Я думаю, что сейчас пришло время положиться на сторонний образ, или я бы лично настроил ночную сборку, чтобы выполнить описанные выше шаги, и автоматически создать образ compose-docker-image в нашем CI для нашего реестра.
Мы лично больше не следуем этой процедуре, потому что вы теряете контроль над запущенными контейнерами, и они могут закончиться бесконечной работой. Это из-за исполнителя docker-in-docker. Мы разработали python-скрипт как обходной путь для уничтожения всех старых контейнеров в нашем CI, который можно найти здесь. Но я не предлагаю больше запускать такие контейнеры.
Ответ 3
Я создал простой контейнер докера, в котором поверх docker:latest
установлен docker-compose
docker:latest
. Смотрите https://hub.docker.com/r/tmaier/docker-compose/
Ваш .gitlab-ci.yml
будет выглядеть так:
image: tmaier/docker-compose:latest
services:
- docker:dind
before_script:
- docker info
- docker-compose --version
buildJob:
stage: build
tags:
- docker
script:
- docker-compose build
Ответ 4
Docker compose также имеет официальное изображение: docker/compose
Это идеальное решение, если вы не хотите устанавливать его на каждом конвейере.
На данный момент у него нет latest
тега, поэтому вам придется обновлять его вручную.
Поскольку изображение использует docker-compose
качестве точки входа, вам необходимо переопределить точку входа обратно в /bin/sh -c
в вашем .gitlab-ci.yml
. В противном случае ваш конвейер потерпит неудачу No such command: sh
# Official docker compose image.
image:
name: docker/compose:1.22.0 # update tag to whatever version you want to use.
entrypoint: ["/bin/sh", "-c"]
services:
- docker:dind
before_script:
- docker version
- docker-compose version
build:
stage: build
script:
- docker-compose down
- docker-compose build
- docker-compose up tester-image
Ответ 5
Если вы не хотите предоставлять пользовательский образ докера с предустановленным docker-compose, вы можете заставить его работать, установив Python во время сборки. С установленным Python вы можете, наконец, установить docker-compose, готовый для раскрутки ваших контейнеров.
image: docker:latest
services:
- docker:dind
before_script:
- apk add --update python py-pip python-dev && pip install docker-compose # install docker-compose
- docker version
- docker-compose version
test:
cache:
paths:
- vendor/
script:
- docker-compose up -d
- docker-compose exec -T php-fpm composer install --prefer-dist
- docker-compose exec -T php-fpm vendor/bin/phpunit --coverage-text --colors=never --whitelist src/ tests/
Используйте docker-compose exec с -T, если вы получаете эту или похожую ошибку:
$ docker-compose exec php-fpm composer install --prefer-dist
Traceback (most recent call last):
File "/usr/bin/docker-compose", line 9, in <module>
load_entry_point('docker-compose==1.8.1', 'console_scripts', 'docker-compose')()
File "/usr/lib/python2.7/site-packages/compose/cli/main.py", line 62, in main
command()
File "/usr/lib/python2.7/site-packages/compose/cli/main.py", line 114, in perform_command
handler(command, command_options)
File "/usr/lib/python2.7/site-packages/compose/cli/main.py", line 442, in exec_command
pty.start()
File "/usr/lib/python2.7/site-packages/dockerpty/pty.py", line 338, in start
io.set_blocking(pump, flag)
File "/usr/lib/python2.7/site-packages/dockerpty/io.py", line 32, in set_blocking
old_flag = fcntl.fcntl(fd, fcntl.F_GETFL)
ValueError: file descriptor cannot be a negative integer (-1)
ERROR: Build failed: exit code 1
Ответ 6
Alpine linux теперь имеет пакет docker-compose в своей "пограничной" ветке, так что вы можете установить его таким образом в .gitlab-ci.yml
a-job-with-docker-compose:
image: docker
services:
- docker:dind
script:
- apk add docker-compose --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
- docker-compose -v