运行docker-compose up (gitlab-ci)时如何运行多个docker容器



每次执行"docker-compose up"时,我都需要部署一个新的容器。因为容器将在Gitlab管道中为每个将在存储库中创建的合并请求运行SQL SERVER数据库。

是否应该传递一个标志来执行此操作?我知道——force-再造,但它再造的是同一个容器。我需要每次调用命令docker-compose up来创建另一个具有相同配置的容器。

有——scale SERVICE=NUM,但它不是我需要的。为什么?因为当我扩展时,我无法控制docker将抓取和使用哪个主机端口。

我打算怎么做?通过一个环境变量。看:

docker-compose文件
version: '2'
services:
db:
image: mcr.microsoft.com/mssql/server:2019-latest
container_name: ${CI_PIPELINE_ID}
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=${DATABASE_PASSWORD}
ports:
- "${CI_PIPELINE_ID}:1433"

我gitlab-ci:

stages:
- database_deploy
- build_and_test
- database_stop
database_deploy:
image: docker:latest
stage: database_deploy
services:
- name: docker
script:
- apk add py-pip
- pip install docker-compose==1.8.0
- cd ./docker; docker-compose up -d; docker ps
build_and_test:
image: maven:latest
stage: build_and_test
script:
- mvn test -Dquarkus.test.profile=homolog
- mvn checkstyle:check
artifacts:
paths:
- target
database_stop: &database_stop
image: docker:latest
stage: database_stop
services:
- name: docker
script:
- docker stop $CI_PIPELINE_ID
- docker rm -f $CI_PIPELINE_ID
- docker ps

cleanup_deployment_failure:
needs: ["build_and_test"]
when: on_failure
<<: *database_stop

Docker-compose将您的服务分组为"项目"。默认情况下,项目名是包含docker-compose.yml文件的目录名。当你运行docker up时,docker-compose将在项目中创建任何不存在的容器。

因为你想让docker-compose up每次都用不同的配置创建新的容器,你需要告诉docker-compose它每次都在不同的项目中运行。您可以使用--project-name(-p)标志来完成此操作。

例如,我们有docker-compose.yml:

version: "3"
services:
web:
image: "alpinelinux/darkhttpd"
ports:
- "${HOSTPORT}:8080"

我可以通过设置HOSTPORT并为每次调用docker-compsoe指定项目名称来调出该堆栈的多个实例:

$ HOSTPORT=8081 docker-compose -p project1 up -d
$ HOSTPORT=8082 docker-compose -p project2 up -d

运行这两个命令后,我们看到:

CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                                       NAMES
825ea98cca55   alpinelinux/darkhttpd   "darkhttpd /var/www/…"   4 seconds ago   Up 3 seconds   0.0.0.0:8082->8080/tcp, :::8082->8080/tcp   project2_web_1
776c12d38bbb   alpinelinux/darkhttpd   "darkhttpd /var/www/…"   9 seconds ago   Up 8 seconds   0.0.0.0:8081->8080/tcp, :::8081->8080/tcp   project1_web_1

我想这正是你要找的。

注意,使用这个配置,您需要在每次运行docker-compose时指定项目名称和HOSTPORT的值。


您也可以使用COMPOSE_PROJECT_NAME环境变量设置项目名称。这意味着您实际上可以使用环境文件来组织内容。

我们可以通过创建project1.env来重现上述行为:
COMPOSE_PROJECT_NAME=project1
HOSTPORT=8081

project2.envwith:

COMPOSE_PROJECT_NAME=project2
HOSTPORT=8082

然后运行:

$ docker-compose --env-file project1.env up -d
$ docker-compose --env-file project2.env up -d

和以前一样,每次运行docker-compose时都需要提供--env-file

最新更新