【问题标题】:How to run multiples docker container when run docker-compose up ( gitlab-ci)运行 docker-compose up 时如何运行多个 docker 容器(gitlab-ci)
【发布时间】:2021-10-17 21:28:22
【问题描述】:

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

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

有--scale SERVICE=NUM,但这不是我需要的。为什么?因为当我扩展时,我无法控制 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 docker-compose gitlab containers gitlab-ci


    【解决方案1】:

    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
    

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

    请注意,使用此配置,每次运行 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

    【讨论】:

    • 很好,但是现在我在运行您传递给我的第一个命令时遇到了一些麻烦。这是一个打印:pasteboard.co/Kg2F3WW.png 它是说“HOSTPORT 不被识别为实习生或外部命令......”你认为我能做些什么来解决它?
    • 这些命令假定一个标准的 Unix 风格的 shell。看起来您是在 Windows 上运行它,所以...在 Windows 中执行任何标准操作以在命令行上设置环境变量。或者直接跳到选项 2,并使用 .env 文件。
    • 这解决了我的问题。谢谢。问题出在标志“-d”上。我需要了解我应该在命令行中将它传递到哪里。
    猜你喜欢
    • 2022-01-03
    • 2021-06-07
    • 2021-06-13
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多