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

jon*_*nua 48 docker gitlab-ci docker-compose

我有一个.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
Run Code Online (Sandbox Code Playgroud)

但在ci-log我收到消息:

$ docker-compose --version
/bin/sh: eval: line 46: docker-compose: not found
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

n2o*_*n2o 64

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

# .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
Run Code Online (Sandbox Code Playgroud)

  • 虽然这有效,但这意味着在 **每个** 构建 docker-compose 需要安装(并获取...),因此会增加构建时间。如果您有多个需要 docker-compose 的作业(并且在生产场景中您可能必须这样做),构建时间将大大延长。 (2认同)

web*_*777 45

Docker撰写也有官方形象:docker/compose

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

它目前没有docker-compose标记,因此您必须手动更新.

由于图像/bin/sh -c用作入口点,因此您需要将入口点覆盖.gitlab-ci.yml的入口点No such command: sh.否则你的管道将失败docker/compose

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

# 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
Run Code Online (Sandbox Code Playgroud)

  • 仅当我添加了变量`DOCKER_HOST:tcp:// docker:2375 /`和`DOCKER_DRIVER:overlay2`时才起作用 (5认同)
  • @webmaster777 当执行达到“docker-compose 版本”时,我收到此错误...`无法连接到 unix:///var/run/docker.sock 上的 Docker 守护进程。docker 守护进程是否正在运行?错误:作业失败:退出代码 1`...我该如何解决? (4认同)
  • 即使设置了所有变量,这对我(共享 gitlab.com 运行者)仍然不起作用,`无法连接到位于 tcp://docker:2375/ 的 Docker 守护进程。docker 守护进程正在运行吗? (4认同)

tma*_*ier 28

我创建了一个简单的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
Run Code Online (Sandbox Code Playgroud)


n2o*_*n2o 11

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


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

$ docker run --rm -it docker sh
/ # find / -iname "python"
/ # 
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 您可以删除其中一个答案吗?令人困惑的是找到两个,加上很多“编辑”消息。(如果需要,我们可以查看编辑历史记录)。 (5认同)
  • 我无法删除已接受的答案:-/ (2认同)

小智 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/
Run Code Online (Sandbox Code Playgroud)

如果收到此错误或类似错误,请使用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
Run Code Online (Sandbox Code Playgroud)


Oll*_*etz 5

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 ...
Run Code Online (Sandbox Code Playgroud)