环境变量未注入多阶段 docker 在 Azure Devops 管道上构建

Environment variable not injected into multi stage docker build on Azure Devops pipeline

我有一个 docker 文件,我可以在本地毫无问题地构建它,但在 Azure Devops 上变量设置不正确。例如。在本地,我可以 运行 一个多阶段 docker 构建,其中工件是从 Azure 工件存储库中获取授权的。授权令牌可以在本地设置而不会出现问题。在构建管道上,我无法正确注入它。

docker 文件:

FROM gradle:5.4.1-jdk8 AS build
ARG AZURE_ARTIFACTS_ENV_ACCESS_TOKEN
ENV AZURE_ARTIFACTS_ENV_ACCESS_TOKEN $AZURE_ARTIFACTS_ENV_ACCESS_TOKEN
COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle build --no-daemon

FROM java:8
COPY --from=build /home/gradle/src/build/libs/medquality-rest-service.jar medquality-rest-service.jar
ADD wait-for-it.sh /wait-for-it.sh
RUN chmod +x /wait-for-it.sh

ENTRYPOINT ["/wait-for-it.sh", \
            "${CORDA_NODE_URL}:${CORDA_NODE_PORT}", \
#            "--strict", \
            "--timeout=60", \
            "--", \
            "java", \
            "-jar", \
            "medquality-rest-service.jar", \
            "--config.rpc.host=${CORDA_NODE_URL}", \
            "--config.rpc.port=${CORDA_NODE_PORT}", \
            "--config.rpc.username=user1", \
            "--config.rpc.password=test"]

命令:

docker build --build-arg AZURE_ARTIFACTS_ENV_ACCESS_TOKEN .

它注入令牌,以便多阶段构建可以获取工件。

一旦我移动到 Azure 管道,它就不会注入值,管道:

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: Gradle@2
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    gradleOptions: '-Xmx3072m'
    javaHomeOption: 'JDKVersion'
    jdkVersionOption: '1.8'
    jdkArchitectureOption: 'x64'
    publishJUnitResults: true
    testResultsFiles: '**/TEST-*.xml'
    tasks: 'build publish'
  env:
      AZURE_ARTIFACTS_ENV_ACCESS_TOKEN: $(System.AccessToken)
- task: Docker@2
  inputs:
    containerRegistry: 'alysidia-container-registry'
    repository: 'medquality-rest-service'
    command: 'buildAndPush'
    arguments: --build-arg AZURE_ARTIFACTS_ENV_ACCESS_TOKEN=1234567
    Dockerfile: '**/Dockerfile'
  # env:
  #     AZURE_ARTIFACTS_ENV_ACCESS_TOKEN: $(System.AccessToken)

第一个 gradle 任务正确注入了变量,但似乎我遗漏了与管道相关的内容。当前的结果是未设置工件 PAT,因此未授权 Docker 任务及其多阶段构建的请求。例如。即使在 gradle 脚本中打印出所有环境变量,AZURE_ARTIFACTS_ENV_ACCESS_TOKEN 也不是 1234567 而是空的。

更新:

我在参数字符串上设置了连字符,看起来很不错但没有成功,添加 运行 回显值未设置:

arguments: '--build-arg AZURE_ARTIFACTS_ENV_ACCESS_TOKEN=$(System.AccessToken)'

Docker文件中的 运行 部分:

ARG AZURE_ARTIFACTS_ENV_ACCESS_TOKEN
RUN echo $AZURE_ARTIFACTS_ENV_ACCESS_TOKEN
ENV AZURE_ARTIFACTS_ENV_ACCESS_TOKEN $AZURE_ARTIFACTS_ENV_ACCESS_TOKEN

运行命令的输出:

Step 3/21 : RUN echo $AZURE_ARTIFACTS_ENV_ACCESS_TOKEN
 ---> Running in 6791245d8990

Removing intermediate container 6791245d8990

我对这个 Dockerfile 的最小示例进行了测试

FROM alpine

ARG a_version
RUN echo $a_version

和这条管道

steps:
- pwsh: ls 'Whosebug/85-docker/'
- task: Docker@2
  inputs:
    containerRegistry: 'devopsmanual-acr'
    command: 'build'
    Dockerfile: 'Whosebug/85-docker/DOCKERFILE'
    arguments: '--build-arg a_version=$(System.AccessToken)'

我得到了

2020-11-23T15:39:04.0075804Z Step 3/12 : RUN echo $a_version
2020-11-23T15:39:04.0228448Z  ---> Running in 45fc8efb4968
2020-11-23T15:39:04.3523862Z ***

这是正确的,因为它检测到秘密并掩盖了它。

如果我运行它不是秘密变量我有:

2020-11-23T15:42:10.0106169Z Step 3/12 : RUN echo $a_version
2020-11-23T15:42:10.0288192Z  ---> Running in a59622e31abb
2020-11-23T15:42:10.3746013Z SomeValue123

其中 SomeValue123 是我的管道变量的值