首页 > 解决方案 > 如何在 dockerfile 中使用来自 gitlab-ci.yml 的变量

问题描述

例如 .gitlab-cy.ymlENV_BACKEND_URI变量

build:
  stage: build
   variables:
     ENV_BACKEND_URI: "http://localhost:4200"
  script:
    - docker-compose build

docker-compose用途dockerfile

FROM node:10-alpine as build-stage
...
...
...
RUN ["chmod", "+x", "/dummy.sh"]
...
...

我想在脚本中使用这个ENV_BACKEND_URI变量dummy.sh

例如只是为了回应它

echo $ENV_BACKEND_URI

我如何通过它?

我已经尝试将其设置为docker-compose.yml

environment:
  - ENV_BACKEND_URI=${ENV_BACKEND_URI}

dockerfile但它在也不可用dymmy.sh

标签: dockerdocker-composeenvironment-variablesgitlab-ci

解决方案


如果我理解正确,那么您想将环境变量的值烘焙到您的图像中。请注意,您宁愿相反,即构建通用图像并通过设置环境变量来调整其行为。不过,这两种方法都是相似的。

为了将环境变量的值烘焙到图像中,您必须使用ARGDockerfile 中的关键字指定环境变量的值,并在从 shell--build-arg使用时或通过compose 文件中的关键字传递其值. 考虑以下 Dockerfile 和 docker-compose 文件:docker buildargs

Dockerfile

FROM alpine

ARG ENV_BACKEND_URI=$ENV_BACKEND_URI

RUN mkdir -p /app
RUN echo $ENV_BACKEND_URI > /app/script.sh

CMD ["cat", "/app/script.sh"]

码头工人-compose.yml

version: "3.7"

services:
  app:
    build:
      context: .
      args:
        ENV_BACKEND_URI: "google.de"

使用ARGDockerfile 中的关键字,我们声明我们要ENV_BACKEND_URI在构建时使用该变量,其值应等于ENV_BACKEND_URI我们在构建期间收到的环境值。我们使用arg关键字在撰写文件中这样做。

调用后docker-compose build && docker-compose up,您最终会看到输出app_1 | google.de。如果您更喜欢使用该docker build命令,您必须先调用docker build --build-arg ENV_BACKEND_URI=google.de --tag=foo . ,然后通过调用docker run foo. 两者都产生相同的输出,即它们打印google.de到标准输出。

对于您的 CI/CD 用例,您必须将撰写文件中的变量值设置为环境中变量的值,即ENV_BACKEND_URI: $ENV_BACKEND_URI.


推荐阅读