如何 运行 倍数 docker 容器 运行 docker-compose up ( gitlab-ci)
How to run multiples docker container when run docker-compose up ( gitlab-ci)
我每次执行“docker-compose up”时都需要部署一个新容器,因为容器将 运行 Gitlab 管道中的 SQL SERVER 数据库将在存储库中创建的合并请求。
是否应该传递一个标志来执行此操作?我知道 --force-recreate,但它会重新创建同一个容器。我需要每次调用命令 docker-compose up 来创建另一个具有相同配置的容器。
有 --scale SERVICE=NUM,但这不是我需要的。为什么?因为当我缩放时我无法控制哪个主机端口 docker 将获取和使用。
我打算怎么做?通过环境变量。看:
docker-编写文件
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.env
与:
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
我每次执行“docker-compose up”时都需要部署一个新容器,因为容器将 运行 Gitlab 管道中的 SQL SERVER 数据库将在存储库中创建的合并请求。
是否应该传递一个标志来执行此操作?我知道 --force-recreate,但它会重新创建同一个容器。我需要每次调用命令 docker-compose up 来创建另一个具有相同配置的容器。
有 --scale SERVICE=NUM,但这不是我需要的。为什么?因为当我缩放时我无法控制哪个主机端口 docker 将获取和使用。
我打算怎么做?通过环境变量。看:
docker-编写文件
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.env
与:
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