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

lig*_*sky 6 environment-variables docker gitlab-ci docker-compose

例如,有 .gitlab-cy.ymlENV_BACKEND_URI可变

build:
  stage: build
   variables:
     ENV_BACKEND_URI: "http://localhost:4200"
  script:
    - docker-compose build
Run Code Online (Sandbox Code Playgroud)

docker-compose 用途 dockerfile

FROM node:10-alpine as build-stage
...
...
...
RUN ["chmod", "+x", "/dummy.sh"]
...
...
Run Code Online (Sandbox Code Playgroud)

我想ENV_BACKEND_URIdummy.sh脚本中使用这个变量

例如只是为了回应它

echo $ENV_BACKEND_URI
Run Code Online (Sandbox Code Playgroud)

我如何通过它?

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

environment:
  - ENV_BACKEND_URI=${ENV_BACKEND_URI}
Run Code Online (Sandbox Code Playgroud)

但它在dockerfile也不可用dymmy.sh

jbo*_*ann 6

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

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

文件

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"]
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: "3.7"

services:
  app:
    build:
      context: .
      args:
        ENV_BACKEND_URI: "google.de"
Run Code Online (Sandbox Code Playgroud)

使用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 用例,您必须将 compose 文件中的变量值设置为环境中变量的值,即ENV_BACKEND_URI: $ENV_BACKEND_URI.