繁体   English   中英

如何在运行 docker-compose 时运行多个 docker 容器 (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-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 updocker-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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM