Запустите сборку 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