环境变量未注入Azure Devops管道上的多级docker构建

环境变量未注入Azure Devops管道上的多级docker构建,docker,gradle,azure-devops,azure-pipelines,docker-multi-stage-build,Docker,Gradle,Azure Devops,Azure Pipelines,Docker Multi Stage Build,我有一个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_TOK

我有一个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_令牌也不是1234567,而是空的

更新:

我在arguments字符串上设置了连字符,看起来是一个不错的候选者,但没有成功,添加了RUN echo,但没有设置值:

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

我对这个Dockerfile做了一个最小的测试

FROM alpine

ARG a_version
RUN echo $a_version
这条管道呢

步骤:
-pwsh:ls‘stackoverflow/85 docker/’
-任务:Docker@2
投入:
containerRegistry:“DevPSManual acr”
命令:“构建”
Dockerfile:'stackoverflow/85 docker/Dockerfile'
参数:'--build arg a_version=$(System.AccessToken)'
我得到

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

如果我为nor SECURE变量运行它,我有:

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吗?是的,在特定的repo中只有一个Dockerfile,Dockerfile是OP中的第一个代码段,除了添加“RUN echo”语句之外,我没有对它进行任何更改。一般来说,我每个服务都有一个repo,那些我推送到注册表并在docker compose本地使用的repo。我用过你的例子,似乎“buildAndPush”不能像预期的那样与参数一起工作,只是使用“build”作为命令工作,变量设置正确。你总是可以将任务拆分为两个单独的任务。是的,我必须,buildAndPush不支持arguments属性,如下所述:RTFM:)非常感谢您的帮助!
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