在.gitlab-ci.yml中运行docker-compose build

时间:2016-10-05 07:56:11

标签: docker docker-compose gitlab-ci

我有一个.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

我做错了什么?

9 个答案:

答案 0 :(得分:58)

从2019-04-09更新:

docker-compose现在需要更多的开发包,这在他们的official documentation中有描述。这是建议的解决方案,但并不能让我满意......太多的软件包可以启动并运行:

# .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

我认为现在是时候依赖第三方图像,或者我个人配置每晚构建来执行上述步骤,并在我们的CI中为我们的注册表自动构建一个compose-docker-image。

我们个人不再遵循此流程,因为您无法控制正在运行的容器,并且最终可能无法运行。这是因为docker-in-docker执行器。我们开发了一个python脚本作为解决方法来杀死CI中的所有旧容器can be found here。但我不建议再装这样的容器了。

旧回答:

@ tmaier的解决方案依赖于第三方图像,我真的不喜欢这个。您只需安装两个软件包即可使用docker-compose获得您自己的并始终最新的配置:

# .gitlab-ci.yml

image: docker

services:
  - docker:dind

build:
  script:
    - apk add --no-cache py-pip      # <--
    - pip install docker-compose     # <--
    - docker-compose up -d

答案 1 :(得分:24)

我创建了一个简单的docker容器,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

答案 2 :(得分:22)

Docker compose还有一个 official 图片:docker/compose

如果您不想在每个管道上都安装它,这是理想的解决方案。

它目前没有latest标签,因此您必须手动更新。

由于图像使用docker-compose作为入口点,因此您需要override the entrypoint回到/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

答案 3 :(得分:9)

编辑我添加了另一个答案,提供支持docker-compose的.gitlab-ci.yml配置的最小示例。

docker-compose可以作为Python包安装,但不随图像一起提供。您选择的图像甚至不提供Python的安装:

$ docker run --rm -it docker sh
/ # find / -iname "python"
/ # 

寻找Python会给出一个空洞的结果。因此,您必须选择一个符合您需求的不同图像,并且最好安装docker-compose,或者您可以手动创建一个。

您选择的泊坞窗图像使用Alpine Linux。如果您不熟悉Alpine Linux,可以将它用作自己图像的基础或首先尝试不同的图像。

我遇到了同样的问题,并在公共GitHub存储库中创建了一个Dockerfile,并将其与我的Docker Hub帐户连接,并选择了一个自动构建来在每次推送到GitHub存储库时构建我的映像。然后,您可以使用GitLab CI轻松访问自己的图像。

答案 4 :(得分:9)

如果您不希望提供预装了docker-compose的自定义docker镜像,则可以在构建期间通过安装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

答案 5 :(得分:2)

我认为以上大部分内容都是有帮助的,但是我需要集体应用它们来解决此问题,以下是对我有用的脚本

我希望它也对您有用

还请注意,在docker中,这是您必须提供的用于映像名称的格式

<registry base url>/<username>/<repo name>/<image name>:<tag>

image:
  name: docker/compose:latest
  entrypoint: ["/bin/sh", "-c"]

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2

services:
  - docker:dind

stages:
- build_images

before_script:
  - docker version
  - docker-compose version
  - docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY

build:
  stage: build_images
  script:
    - docker-compose down
    - docker-compose build
    - docker-compose push

答案 6 :(得分:1)

Alpine linux现在在其“ edge”分支中具有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

答案 7 :(得分:1)

与Gitlab.com共享跑步者一起工作真的花了我一些时间。

我想说“使用docker/compose:latest就是这样”,但是不幸的是我无法使其工作,即使设置了所有env变量,我也遇到Cannot connect to the Docker daemon at tcp://docker:2375/. Is the docker daemon running?错误。

我都不喜欢选择安装五千个依赖项来通过pip安装docker-compose

幸运的是,对于最新的Alpine版本(3.10 +),Alpine存储库中有docker-compose软件包。这意味着@ n2o的answer可以简化为:

test:
  image: docker:19.03.0

  variables:
    DOCKER_DRIVER: overlay2
    # Create the certificates inside this directory for both the server
    # and client. The certificates used by the client will be created in
    # /certs/client so we only need to share this directory with the
    # volume mount in `config.toml`.
    DOCKER_TLS_CERTDIR: "/certs"

  services:
    - docker:19.03.0-dind

  before_script:
    - apk --no-cache add docker-compose      # <---------- Mind this line
    - docker info
    - docker-compose --version

  stage: test
  script:
      - docker-compose build

对于我来说,这从第一次尝试起就非常有效。也许没有其他答案的原因是在Gitlab.com共享运行程序的某些配置中,我不知道...

答案 8 :(得分:0)

tiangolo/docker-with-compose可以工作:

image: tiangolo/docker-with-compose

stages:
  - build
  - test
  - release
  - clean

  
before_script:
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com

build:
  stage: build
  script:
    - docker-compose -f docker-compose-ci.yml build --pull 


test1:
    stage: test
    script:
        - docker-compose -f docker-compose-ci.yml up -d
        - docker-compose -f docker-compose-ci.yml exec -T php ...