环境变量未注入Azure Devops管道上的多级docker构建
我有一个docker文件,我可以在本地构建而不会出现问题,在Azure Devops上,变量设置不正确。例如,在本地,我可以运行一个多阶段docker构建,其中工件通过授权从Azure工件存储库获取。可以在本地设置授权令牌,而不会出现问题。在构建管道上,我无法正确地注入它 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
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