在 GitLab CI 管道中使用 docker-compose

Posted

技术标签:

【中文标题】在 GitLab CI 管道中使用 docker-compose【英文标题】:Using docker-compose in a GitLab CI pipeline 【发布时间】:2017-07-06 20:00:39 【问题描述】:

我正在尝试使用以下 .gitlab-ci.yml 文件实现 GitLab 持续集成 (CI) 管道:

image: docker:latest

# When using dind, it's wise to use the overlayfs driver for
# improved performance.
variables:
  DOCKER_DRIVER: overlay

services:
  - docker:dind

before_script:
  - docker info
  - curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  - chmod +x /usr/local/bin/docker-compose
  - export PATH=/usr/local/bin:$PATH
  - echo $PATH

stages:
  - build
  - test

build:
  stage: build
  script:
    - docker-compose build
    - docker-compose up -d

test:
  stage: test
  script:
    - cd tests/tester
    - pytest test_run_tester.py
  except:
    - /^.*skip_tests$/

但是,在 GitLab 中,我收到以下错误消息:

Running with gitlab-ci-multi-runner 1.10.4 (b32125f)
Using Docker executor with image docker:latest ...
Starting service docker:dind ...
Pulling docker image docker:dind ...
Waiting for services to be up and running...
Pulling docker image docker:latest ...
Running on runner-2e54fd37-project-13-concurrent-0 via scw-de9c9c...
Fetching changes...
HEAD is now at 2504a08 Update CI config
From https://lab.iperlane.com/gio/ipercron-compose
   2504a08..5c2f23f  CI         -> origin/CI
Checking out 5c2f23f1 as CI...
Skipping Git submodules setup
$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: overlay
 Backing Filesystem: extfs
 Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1
runc version: 9df8b306d01f59d3a8029be411de015b7304dd8f
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.8.14-docker-2
Operating System: Alpine Linux v3.5 (containerized)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.751 GiB
Name: 90395a030c02
ID: 7TKR:5PQN:XLFM:EJST:NF2V:NLQC:I2IZ:6OZG:TR4U:ZEAK:EVXE:HIF7
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
$ curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   600    0   600    0     0   1175      0 --:--:-- --:--:-- --:--:--  1176

  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  3 7929k    3  254k    0     0   116k      0  0:01:08  0:00:02  0:01:06  258k
 17 7929k   17 1358k    0     0   433k      0  0:00:18  0:00:03  0:00:15  704k
 61 7929k   61 4861k    0     0  1164k      0  0:00:06  0:00:04  0:00:02 1636k
100 7929k  100 7929k    0     0  1703k      0  0:00:04  0:00:04 --:--:-- 2300k
$ chmod +x /usr/local/bin/docker-compose
$ export PATH=/usr/local/bin:$PATH
$ docker-compose build
/bin/sh: eval: line 51: docker-compose: not found
ERROR: Build failed: exit code 127

系统似乎无法找到docker-compose,即使在安装并添加到路径后也是如此。是否有其他图像可以制作docker-compose 命令,或者在.gitlab-ci.yml 中安装它的不同方式?

【问题讨论】:

您是否尝试过设置docker-compose的绝对路径? @Kurt Peek:您使用了三种安装类型中的哪一种:docs.gitlab.com/ee/ci/docker/… 此问题与***.com/questions/39868369/…有关 【参考方案1】:

Docker-compose 现在是 official image。你可以放

image: 
  name: docker/compose:1.23.2
  entrypoint: [""]

在您的.gitlab-ci.yml 顶部。您需要删除撰写图像的默认入口点,这是由第二行完成的。之后,您可以同时使用dockerdocker-compose

这适用于 GitLab 9.4。您还可以构建自定义图像

FROM docker/compose:1.23.2
ENTRYPOINT []

并将其用作您的图像。

【讨论】:

这似乎没有启动 docker 守护进程,导致docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory')) 没错。使用 docker 镜像(或派生镜像,如 compose)只会提供 docker 命令行实用程序。您仍然需要设置 docker 守护程序,这通常通过将 docker:dind (docker-in-docker) 作为服务来完成。然后,您的作业连接到在另一个容器(但在同一网络中)中运行的守护程序。我正在玩我们的设置,但我无法重现您的确切错误。【参考方案2】:

问题

这是一个复杂的问题。

docker:latest 映像基于 alpine (Alpine Linux),它是使用 musl-libc 构建的。这个系统非常简单,因此没有成熟的桌面 Linux 可能拥有的一切。事实上,动态的可执行文件需要专门为这个系统编译。

docker-compose 是一个 Python 应用程序,使用 PyInstaller 捆绑到 Linux 可执行文件中。这些可执行文件实际上只希望能够在它们构建的系统上运行。如果您运行alpine 容器和apk add file,您可以看到您下载的(动态链接的)可执行文件需要特定的解释器。

# file /usr/local/bin/docker-compose
/usr/local/bin/docker-compose.pyinstaller: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=00747fe5bcde089bb4c2f1ba7ab5348bc02ac5bf, stripped

问题是/lib64/ld-linux-x86-64.so.2alpine 中不存在。事实上,/lib64 甚至都不存在。

解决办法

因为docker-compose是一个Python应用程序,所以can also be installed using pip

alpine 容器内测试:

$ docker run --rm -it alpine /bin/bash

这里是你可以手动运行的命令,或者添加到你的.gitlab-ci.ymlbefore_script

# apk add --no-cache python py2-pip
...
# pip install --no-cache-dir docker-compose
...
# docker-compose -v
docker-compose version 1.11.1, build 7c5d5e4

事实证明,这实际上是一个未解决的问题:

https://github.com/docker/compose/issues/3465

【讨论】:

很好的解释。我创建了一个简单的 docker 映像来节省安装过程中的宝贵时间。见hub.docker.com/r/tmaier/docker-compose

以上是关于在 GitLab CI 管道中使用 docker-compose的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 Gitlab CI/CD 管道上的 Docker 中收到“不允许跨设备链接”错误?

GitLab-CI 在管道中获取 pom 版本

使用 Gitlab CI 时如何设置 docker 容器的主机名

docker-in-docker (dind) 服务在 gitlab ci 中的作用

在 gitlab ci 中使用 ssh docker-compose 到远程主机失败

在 gitlab 管道中使用 semver 或时间戳