【问题标题】:Environment variable not injected into multi stage docker build on Azure Devops pipeline环境变量未注入到 Azure Devops 管道上的多阶段 docker 构建中
【发布时间】:2021-03-05 18:35:38
【问题描述】:

我有一个 docker 文件,我可以在本地毫无问题地构建它,但在 Azure Devops 上,变量设置不正确。例如。在本地,我可以运行一个多阶段的 docker build,其中工件是从具有授权的 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 而是空的。

更新:

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

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

Dockerfile 中的 RUN 部分:

ARG AZURE_ARTIFACTS_ENV_ACCESS_TOKEN
RUN echo $AZURE_ARTIFACTS_ENV_ACCESS_TOKEN
ENV AZURE_ARTIFACTS_ENV_ACCESS_TOKEN $AZURE_ARTIFACTS_ENV_ACCESS_TOKEN

RUN 命令的输出:

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

Removing intermediate container 6791245d8990

【问题讨论】:

    标签: docker gradle azure-devops azure-pipelines docker-multi-stage-build


    【解决方案1】:

    我为这个 Dockerfile 的最小示例做了一个测试

    FROM alpine
    
    ARG a_version
    RUN echo $a_version
    

    还有这条管道

    steps:
    - pwsh: ls 'stackoverflow/85-docker/'
    - task: Docker@2
      inputs:
        containerRegistry: 'devopsmanual-acr'
        command: 'build'
        Dockerfile: 'stackoverflow/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 是我的管道变量的值

    【讨论】:

    • 你的仓库中只有一个 Dockerfile 吗?你可以试试更小的东西吗?我的意思是它可以工作并锻炼你的 Dockerfile,很难捕捉到这种边缘情况。你能分享你的 Dockerfile 吗?
    • 是的,在那个特定的仓库中只有一个 Dockerfile,Dockerfile 是 OP 中的第一个代码 sn-p,除了添加“RUN echo”语句外,我没有更改它。一般来说,我每个服务都有一个 repo,那些我推送到注册表并在本地 docker-compose 中使用它们。
    • 我使用了您的示例,似乎“buildAndPush”无法按预期使用参数,只需使用“build”作为命令即可,变量已正确设置。
    • 你总是可以将任务分成两个独立的。
    • 是的,我必须这样做,buildAndPush 不支持 arguments 属性,如所述:docs.microsoft.com/en-us/azure/devops/pipelines/tasks/build/… RTFM :) 非常感谢您的帮助!
    猜你喜欢
    • 2018-04-20
    • 2020-11-23
    • 2019-09-30
    • 2020-04-28
    • 2021-07-20
    • 2020-09-06
    • 2022-11-24
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多