【问题标题】:Share env variables between Docker-Compose and GitLab-CI在 Docker-Compose 和 GitLab-CI 之间共享环境变量
【发布时间】:2019-12-13 12:38:56
【问题描述】:

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

现在,考虑一个 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

然后,在项目的 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

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

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

# .env
GITLAB=localhost:8081/images
SERVICE_1=name_of_service_1
SERVICE_2=name_of_service_2

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

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

【问题讨论】:

    标签: docker docker-compose environment-variables gitlab-ci


    【解决方案1】:

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

    script:
        - source ./env
        - docker pull "${GITLAB}/${SERVICE_1}"
        - docker tag "${GITLAB}/${SERVICE_1}" "${GITLAB}/${SERVICE_1}:rel-18.04"
    

    【讨论】:

    • 我可能太专注于如何让 GitLab 和 Docker 合作,没有意识到这是如何通过 bash 脚本source 轻松解决的。这非常有效,解决了我的问题。谢谢。
    【解决方案2】:

    .gitlab-ci.yml 没有内置方法可以通过外部文件(例如,您的 .env 文件)加载环境变量。

    您可以尝试将环境变量添加到您的.gitlab-ci.yml 文件itself(除了本地使用的.env 文件)。

    这看起来像是在复制粘贴代码,但 CI 系统运行的环境与您通过文件在本地运行的环境相同(例如,.gitlab-ci.yml 用于 GitLab CI)和您在本地使用的相同命令,所以没关系。

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 1970-01-01
      • 2020-01-10
      • 2017-09-12
      • 2015-06-17
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多