如何 运行 倍数 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