如何在构建期间通过cloudbuild.yaml正确获取/设置env变量?

时间:2018-03-28 09:40:03

标签: docker google-cloud-platform dockerfile google-container-registry

我正在使用Google Cloud Container Builder来构建我的图片。我将它连接到我的GitHub存储库,以便通过推送到特定分支来触发它。 我明确地使用介词为我的构建步骤提供了一些env变量。

cloudbuild.yaml

steps:
...
- name: gcr.io/cloud-builders/docker
  args: ['build', '-t', 'eu.gcr.io/${PROJECT_ID}/project-name:${SHORT_SHA}', '.']
  env:
    - 'TEST_ENV=test123'
    - 'TEST=${_TEST}'
...

Dockerfile

FROM alpine:latest

RUN printenv

...

我可以在Env的构建细节中看到我的env变量。触发构建时,此构建步骤的Vars部分:TEST_ENV=test123 TEST=test_prepositon

但是当执行RUN printenv时,我只看到HOSTNAME, SHLVL, HOME, PATH, PWD env vars。

我的错误在哪里?提前谢谢。

2 个答案:

答案 0 :(得分:1)

您的示例是将环境变量传递给docker命令,但不传递给docker构建上下文。

当您通过env设置环境变量时,这些envvars会在正在运行的容器中设置。但是当docker执行docker build时,它默认情况下不会将环境传递给构建上下文。

要设置环境变量,以便可以通过RUN指令在构建上下文中访问它们,请传递docker build --build-arg

Here is Docker's documentation关于设置构建时变量。

答案 1 :(得分:1)

这是您要查找的内容的完整示例。

cloudbuild.yaml:

steps:
  - name: "gcr.io/cloud-builders/docker"
    args: [
      "build",
      "-t",
      "gcr.io/$PROJECT_ID/$REPO_NAME:$SHORT_SHA",
      ".",
      "--build-args", "SOME_ARG=${_VAR_NAME_FROM_GOOGLE_TRIGGERS}"
    ]

Dockerfile:

ARG SOME_ARG
ENV SOME_ENV_VAR_NAME=${SOME_ARG}

可以在docker容器中直接访问变量SOME_ENV_VAR_NAME

此外,我想添加2篇很棒的文章来解释docker arg和env: