如何在单个 Gitlab CI 作业中拥有多个 docker 容器?

问题描述 投票:0回答:1

我的项目有多个组件,需要在单独的容器中运行并相互连接。我正在尝试在 Gitlab CI 的单个“测试”阶段作业中运行整个项目的测试。为此,我需要创建多个泊坞窗并手动设置每个组件。有没有办法在 Gitlab CI 中做到这一点?

如有任何建议,我们将不胜感激。谢谢!

docker gitlab continuous-integration gitlab-ci
1个回答
7
投票

在 gitlab.com 上使用共享运行器时,有几种主要方法可以在 GitLab 作业中运行多个 docker 容器

服务

您可以使用服务来启动多个容器。举例来说,您的工作依赖于数据库,您可以在

services:
中的
.gitlab-ci.yml
键中指定这一点。您还可以选择为主机名指定
alias:
,通过该主机名可以从您的作业访问这些服务

my_job:
  environment:
    POSTGRES_PASSWORD: password
    POSTGRES_USERNAME: postgres
    POSTGRES_DB: dbname
  services:
    - name: postgres:latest
      alias: mydatabase.local

  script:
    - psql -h mydatabase.local -u $POSTGRES_USERNAME --password $POSTGRES_PASSWORD -d $POSTGRES_DB
    - ...


这种方法有一些局限性,包括:

  • 服务无法访问存储库文件
  • 如果您需要构建服务容器,则必须在之前的构建阶段构建它们并将镜像推送到注册表
  • 并非所有 docker 选项都可供您使用(例如,卷挂载、独立环境变量等)

如果这些限制影响您,则应使用以下方法:

Docker-in-docker (docker:dind)

您还可以在作业中使用

docker
来设置多个容器。这是使用
docker:dind
服务来完成的。然后您可以使用
docker run
docker-compose
设置工作所需的其他容器。

如果您必须的话,这特别有用

my_job:
  image: docker:19.03.12
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""
    DOCKER_DRIVER: overlay2

  services:
    - docker:19.03.12-dind

  script:
    - docker run --rm -d -p 80:80 strm/helloworld-http
    - curl http://docker

您还可以使用

docker build
docker-compose
或任何通常用于设置容器的常用 docker 接口。

需要注意的一件重要事情是,由于您的 docker 容器通过

docker:dind
服务运行,因此运行容器公开的端口将通过该服务公开。因此,与您在本地开发中熟悉的方式不同,您无法使用
curl http://localhost:Port
来访问端口映射的容器。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.