Переменная среды, не введенная в многоступенчатую сборку docker в конвейере Azure Devops

#docker #gradle #azure-devops #azure-pipelines #docker-multi-stage-build

#docker #gradle #azure-devops #azure-конвейеры #docker-многоступенчатая сборка

Вопрос:

У меня есть файл 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)
 

Задача 1-го класса вводит переменную правильно, но, похоже, я упускаю что-то, связанное с конвейером. В настоящее время результатом является то, что артефакт PAT не установлен, и поэтому запрос не авторизован для задачи Docker и ее многоступенчатой сборки. Например, даже распечатывая все переменные среды в скрипте gradle, AZURE_ARTIFACTS_ENV_ACCESS_TOKEN не 1234567, а пустой.

Обновить:

Я установил дефисы в строке аргументов, выглядел как хороший кандидат, но безуспешно, добавив RUN echo значение не установлено:

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

Раздел RUN в файле Dockerfile:

 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
 

Ответ №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 ***
 

что правильно, потому что оно обнаружило секрет и замаскировало его.

Если я запускаю ее для секретной переменной nor, у меня есть:

 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 значение моей переменной конвейера

Комментарии:

1. У вас есть только один файл Dockerfile в вашем репозитории? Можете ли вы попробовать что-то меньшее? Я имею в виду, что это работает и тренирует ваш Dockerfile, было бы трудно уловить этот крайний случай. Можете ли вы поделиться своим файлом Dockerfile?

2. Да, в этом конкретном репозитории есть только один Dockerfile, Dockerfile — это первый фрагмент кода в OP, я не изменил его, кроме добавления инструкции «RUN echo». У меня есть один репозиторий для каждой службы в целом, те, которые я помещаю в реестр и использую их в docker-compose локально.

3. Я использовал ваш пример, кажется, что «buildAndPush» не работает с аргументами, как ожидалось, просто используя «build» в качестве команды, переменная установлена правильно.

4. Вы всегда можете разделить задачу на две отдельные.

5. Да, я должен, свойство arguments не поддерживается для buildAndPush, как описано: docs.microsoft.com/en-us/azure/devops/pipelines/tasks/build/… RTFM 🙂 Большое вам спасибо за вашу помощь!