如何在单个 Gitlab CI 作业中拥有多个 docker 容器?
How to have multiple docker containers in a single Gitlab CI job?
我的项目有多个组件需要 运行 在不同的容器中并相互连接。我正在尝试 运行 在 Gitlab CI 中的单个“测试”阶段作业中测试整个项目。为此,我需要创建多个泊坞窗并手动设置每个组件。有没有办法在 Gitlab CI 中做到这一点?
如有任何建议,我们将不胜感激。谢谢!
在 gitlab.com
上使用共享 运行ners 时,有几种主要方法可以在 GitLab 作业中 运行 多个 docker 容器
服务
您可以使用服务启动多个容器。比方说,您的工作依赖于数据库,您可以在 .gitlab-ci.yml
中的 services:
键中指定它。您还可以选择为主机名指定一个 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
服务,运行ning 容器公开的端口通过该服务公开。因此,与您在本地开发中可能熟悉的方式不同,您不能使用 curl http://localhost:Port
访问端口映射容器。
参考文献:
我的项目有多个组件需要 运行 在不同的容器中并相互连接。我正在尝试 运行 在 Gitlab CI 中的单个“测试”阶段作业中测试整个项目。为此,我需要创建多个泊坞窗并手动设置每个组件。有没有办法在 Gitlab CI 中做到这一点?
如有任何建议,我们将不胜感激。谢谢!
在 gitlab.com
上使用共享 运行ners 时,有几种主要方法可以在 GitLab 作业中 运行 多个 docker 容器服务
您可以使用服务启动多个容器。比方说,您的工作依赖于数据库,您可以在 .gitlab-ci.yml
中的 services:
键中指定它。您还可以选择为主机名指定一个 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
服务,运行ning 容器公开的端口通过该服务公开。因此,与您在本地开发中可能熟悉的方式不同,您不能使用 curl http://localhost:Port
访问端口映射容器。