环境变量未注入多阶段 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
是我的管道变量的值
我有一个 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
是我的管道变量的值