在 Docker-Compose 和 GitLab-CI 之间共享环境变量

mag*_*nus 5 environment-variables docker gitlab-ci docker-compose

注意:我省略了以下配置文件中的一些细节、阶段和设置,以使帖子更短,问题更“可读”。如果您认为缺少重要细节,请发表评论,我将(重新)添加它们。

现在,考虑一个 docker-compose 项目,由以下配置描述,

# docker-compose.yml
version: '3'

services:
    service_1:
        build: ./service_1
        image: localhost:8081/images/name_of_service_1
        container_name: name_of_service_1
    service_2:
        build: ./service_2
        image: localhost:8081/images/name_of_service_2
        container_name: name_of_service_2
Run Code Online (Sandbox Code Playgroud)

然后,在项目的 git 存储库中,我们有另一个文件,用于 GitLab 持续集成配置,

# .gitlab-ci.yml
image: docker:latest

stages:
    - build
    - release

Build:
    stage: build
    script:
        - docker-compose build
        - docker-compose push

# Release by re-tagging some specific (not all) images with version num
Release:
    stage: release
    script:
        - docker pull localhost:8081/images/name_of_service_1
        - docker tag localhost:8081/images/name_of_service_1 localhost:8081/images/name_of_service_1:rel-18.04
Run Code Online (Sandbox Code Playgroud)

现在,这一切都很好,但我发现我必须在两个文件中复制图像名称,这令人沮丧。这里的挑战(在我看来)是发布阶段不会发布构成部分的所有图像,因为有些是纯粹的模拟/虚拟图像,纯粹用于测试。因此,我需要单独标记/推送图像和容器。

我希望只能定义一次图像名称:我尝试引入该.env文件,该文件是由自动导入的docker-compose.yml

# .env
GITLAB=localhost:8081/images
SERVICE_1=name_of_service_1
SERVICE_2=name_of_service_2
Run Code Online (Sandbox Code Playgroud)

这让我更新docker-compose.yml以使用这些变量并写入image: "${GITLAB}/${SERVICE_1}"而不是上面的原始文件。但是,我无法将这些变量导入到 中 gitlab-ci.yml因此需要复制它们。

有没有一种简单的方法来创建 docker-compose.yml .gitlab-ci.yml 共享一些(环境)变量?

For*_*vin 5

我不确定你的问题是什么。那么您的项目根目录中有一个 .env 文件,其中包含您需要在发布作业中设置的所有变量?为什么不像这样加载它们:

script:
    - source ./env
    - docker pull "${GITLAB}/${SERVICE_1}"
    - docker tag "${GITLAB}/${SERVICE_1}" "${GITLAB}/${SERVICE_1}:rel-18.04"
Run Code Online (Sandbox Code Playgroud)

  • 我可能太专注于如何让 GitLab 和 Docker 合作,没有意识到如何通过 bash 脚本“source”轻松解决这个问题。这非常有效并解决了我的问题。谢谢。 (2认同)