在.gitlab-ci.yml中运行docker-compose构建

jpfvwuh4  于 2023-01-12  发布在  Docker
关注(0)|答案(9)|浏览(249)

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

我哪里做错了?

nc1teljy

nc1teljy1#

Docker还提供了一张 * 官方 * 图片:docker/compose
如果您不想在每条管道上都安装它,这是理想的解决方案。
请注意,在最新版本的GitLab CI/Docker中,您可能需要为GitLab CI Runner给予特权访问权限,并配置/禁用TLS。

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

# Official docker compose image.
image:
  name: docker/compose:latest

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

请注意,在1.25**之前的docker-compose**版本中:
由于映像使用docker-compose-entrypoint.sh作为入口点,您需要在.gitlab-ci.yml中将其 * 覆盖 * 回/bin/sh -c。否则,您的管道将因No such command: sh而失败

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

dluptydi2#

以下是正式文件:

# .gitlab-ci.yml
image: docker
services:
  - docker:dind    
build:
  script:
    - apk add --no-cache docker-compose
    - docker-compose up -d

示例停靠器-composite.yml:

version: "3.7"
services:
  foo:
    image: alpine
    command: sleep 3
  bar:
    image: alpine
    command: sleep 3

我们个人不再遵循这个流程,因为您对正在运行的容器失去控制,它们可能会无休止地运行。这是因为docker-in-docker执行器。我们开发了一个python脚本作为一个解决方案,以删除CI中的所有旧容器,即can be found here。但我不建议再像这样启动容器。

7fhtutme

7fhtutme3#

我创建了一个简单的Docker容器,它将docker-compose安装在docker:latest之上。
您的.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
q8l4jmvw

q8l4jmvw4#

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

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

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

查找Python会得到一个空的结果,所以你必须选择一个不同的映像,它适合你的需要,并且最好安装了docker-compose或者你自己创建一个。
您选择的Docker映像使用Alpine Linux。您可以将其用作自己映像的基础,如果您不熟悉Alpine Linux,也可以先尝试其他映像。
我也遇到了同样的问题,我在一个公共GitHub仓库中创建了一个Dockerfile,并将其与我的Docker Hub账户连接,选择了自动构建,在每次推送到GitHub仓库时构建我的图像。

euoag5mw

euoag5mw5#

如果你不想提供一个预装了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
np8igboo

np8igboo6#

我认为上面的大部分都是有帮助的,但是我需要集体应用它们来解决这个问题,下面是为我工作的脚本
希望你也能成功
还请注意,在您的docker compose中,这是您必须为图像名称提供的格式
<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
5ssjco0h

5ssjco0h7#

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

mxg2im7a8#

我确实花了一些时间才让它与Gitlab.com共享跑步者一起工作。
我想说“使用docker/compose:latest,就是这样”,但不幸的是,我无法使它工作,我得到Cannot connect to the Docker daemon at tcp://docker:2375/. Is the docker daemon running?错误,即使所有的env变量设置。
我也不喜欢通过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共享跑步者的某些配置中,我不知道...

0vvn1miw

0vvn1miw9#

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

相关问题