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

标签 docker docker-compose gitlab containers 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 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

我认为这正是您正在寻找的。

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


您还可以使用 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

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

关于docker - 如何在运行 docker-compose up 时运行多个 docker 容器(gitlab-ci),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68792489/

相关文章:

docker - 在 docker-compose.yml 中重用环境变量

git - 使孤立的 git 替换引用过期

amazon-web-services - Jenkins amazon-ecr 插件问题

docker-compose 失败 : Too many open files

docker - 我在traefik后面的docker上运行kibana时得到404,但是可以到达elastic

gitlab - Gitlab 中的范围标签作为徽章

linux - GCP 计算实例上的部署失败为什么从 Gitlab 推送更改

docker - 我可以配置Poltergeist/Capybara指向Docker容器中的PhantomJS吗?

python - 在我尝试安装 pip install -r requirements.txt 文件后,Docker 构建出现错误

docker - 如何在 dockerfile 中使用来自 gitlab-ci.yml 的变量