#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 🙂 Большое вам спасибо за вашу помощь!