如何在Google Cloud build上传递替换变量以运行dockerfile

3hvapo4f  于 12个月前  发布在  Docker
关注(0)|答案(2)|浏览(118)

我已经在Google Cloud build上设置了一个Github触发器。我已经有一个dockerfile来执行构建步骤。由于没有传递替换变量的规定,我试图使用云构建配置文件(yaml)构建它,然后在配置文件中传递dockerfile的路径。
这是云构建配置文件,我需要传递5个变量给Dockerfile来使用,yaml文件如下所示:

steps:
- name: 'gcr.io/cloud-builders/docker'
  env:
  - 'ACCESS_TOKEN=$ACCESS_TOKEN'
  - 'BRANCH=$BRANCH'
  - 'UTIL_BRANCH=$UTIL_BRANCH'
  - 'ARG_ENVIRONMENT=$ARG_ENVIRONMENT'
  - 'ARG_PYTHON_SCRIPT=$ARG_PYTHON_SCRIPT'
  args:
  - build
  - "--tag=gcr.io/$PROJECT_ID/quickstart-image"
  - "--file=./twitter/dax/processing_scripts/Dockerfile"
  - .

字符串
当触发器运行构建时,我在dockerfile中的一个构建步骤中得到一个错误,说变量不可用。很明显,在yaml文件中传递的环境变量没有被传递到Dockerfile进行消费。这就是我在触发器页面x1c 0d1x中填充替换变量的方式
粘贴步骤5中发生错误的构建代码,在此之前只是运行apt-get update命令:

Step 5/28 : RUN git config --global url."https://${ACCESS_TOKEN}:@github.com/".insteadOf "https://github.com/" && echo $(ACCESS_TOKEN)
 ---> Running in f7b94bc2a0d9

/bin/sh: 1: ACCESS_TOKEN: not found
Removing intermediate container f7b94bc2a0d9
 ---> 30965207dcec
Step 6/28 : ARG BRANCH
 ---> Running in 93e36589ac48
Removing intermediate container 93e36589ac48
 ---> 1d1508b1c1d9
Step 7/28 : RUN git clone https://github.com/my_repo45/twitter.git -b "${BRANCH}"
 ---> Running in fbeb93dbb113
Cloning into 'twitter'...
remote: Repository not found.
fatal: Authentication failed for 'https://github.com/my_repo45/twitter.git/'
The command '/bin/sh -c git clone https://github.com/my_repo45/twitter.git -b "${BRANCH}"' returned a non-zero code: 128
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/docker" failed: step exited with non-zero status: 128```

Could anyone please point out what the issue and validate if the environment declaration is proper?

fnx2tebb

fnx2tebb1#

您仍然需要将变量添加到docker build命令中。与您当前的情况一样,替代变量仅在cloud build中可用,而不是作为常规环境变量。下面概述了如何将这些变量传递到cloud build的简化示例。请注意,您只能在dockerfile中与ARG一起使用,而不能与ENV一起使用。

steps:
- name: 'gcr.io/cloud-builders/docker'
  env:
    - 'ACCESS_TOKEN=$_ACCESS_TOKEN'
  args:
    - build
    - "--build-arg=ACCESS_TOKEN=${ACCESS_TOKEN}"
    - "--tag=gcr.io/$PROJECT_ID/quickstart-image"
    - "--file=./twitter/dax/processing_scripts/Dockerfile"

字符串
另一种选择是在docker build命令所在的同一构建步骤中导出环境变量:

steps:
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  env:
    - 'ACCESS_TOKEN=$_ACCESS_TOKEN'
  args:
  - '-c'
  - |
    export ACCESS_TOKEN=${ACCESS_TOKEN}
    docker build \
      --tag=gcr.io/$PROJECT_ID/quickstart-image" \
      --file=./twitter/dax/processing_scripts/Dockerfile"


当然,您可能会争论在这个设置中是否仍然需要env字段,我将把它留给您。

ikfrs5lh

ikfrs5lh2#

我不是这方面的Maven,可能做得不太好,但我能够非常简单地将云构建中的替代变量转换为容器中的环境变量:
首先,我在cloudbuild.yml文件中添加了以下行:

- "--build-arg=ARGUMENT_NAME=${_SUBSTITUTION_VARIABLE_NAME}"

字符串
我把它作为构建步骤中的第二个参数。
我在cloudbuild.yml文件中没有 * 这些行:

env:
    - '_SUBSTITUTION_VARIABLE_NAME=$_SUBSTITUTION_VARIABLE_NAME'


我不认为这些行在这个上下文中有任何作用。所以,我只需要插入一个新行来设置它。
然后,我把这个添加到dockerfile中:

ARG ARGUMENT_NAME
ENV ENVIRONMENT_VARIABLE_NAME=$ARGUMENT_NAME


根据我的研究,这些行需要在任何FROM命令之后。
我相信这与Cloudkollektiv的第一个解决方案在功能上是相同的,但我想试着更清楚地说明在cloudbuild和dockerfile中到底要放什么。

相关问题