Используйте build-arg из докера для создания файла json

У меня есть команда сборки докеров, которую я запускаю в оболочке выполнения Jenkins.

docker build -f ./fastlane.dockerfile \
  -t fastlane-test \
  --build-arg PLAY_STORE_CREDENTIALS=$(cat PLAY_STORE_CREDENTIALS) \
  .

PLAY_STORE_CREDENTIALS — это файл JSON, сохраненный в Jenkins с использованием управляемых файлов. И затем внутри моего Докерфайл у меня есть

ARG PLAY_STORE_CREDENTIALS
ENV PLAY_STORE_CREDENTIALS=$PLAY_STORE_CREDENTIALS
WORKDIR /app/packages/web/android/fastlane/PlayStoreCredentials
RUN touch play-store-credentials.json
RUN echo $PLAY_STORE_CREDENTIALS >> ./play-store-credentials.json
RUN cat play-store-credentials.json

cat выводит пустую строку или вообще ничего.

Содержание PLAY_STORE_CREDENTIALS:

{
  "type": "...",
  "project_id": "...",
  "private_key_id": "...",
  "private_key": "...",
  "client_email": "...",
  "client_id": "...",
  "auth_uri": "...",
  "token_uri": "...",
  "auth_provider_x509_cert_url": "...",
  "client_x509_cert_url": "..."
}

Есть идеи, где проблема?

Возможно PLAY_STORE_CREDENTIALS = "$(cat PLAY_STORE_CREDENTIALS)" чтобы ваша кошка была в безопасности в космосе.

β.εηοιτ.βε 05.05.2022 13:26

@β.εηοιτ.βε Все та же проблема. RUN cat play-store-credentials.json регистрирует пустую строку в jenkins

Hayk Shakhbazyan 05.05.2022 13:29

Было бы полезно, если бы вы предоставили анонимную версию содержания PLAY_STORE_CREDENTIALS.

β.εηοιτ.βε 05.05.2022 13:33

@β.εηοιτ.βε Добавил это к вопросу. Ничего особенного с моей точки зрения в json файле

Hayk Shakhbazyan 05.05.2022 13:36
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
4
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть ли на самом деле файл с именем PLAY_STORE_CREDENTIALS? Если это так, и если это стандартный файл JSON, я ожидаю, что ваша данная командная строка завершится ошибкой; если файл содержит пробел Любые (что типично для файлов JSON), эта команда должна привести к ошибке, например...

"docker build" requires exactly 1 argument.

Например, если у меня есть в PLAY_STORE_CREDENTIALS образец контента из вашего вопроса, мы видим:

$ docker build -t fastlane-test --build-arg PLAY_STORE_CREDENTIALS=$(cat PLAY_STORE_CREDENTIALS) .
"docker build" requires exactly 1 argument.
See 'docker build --help'.

Usage:  docker build [OPTIONS] PATH | URL | -

... потому что вы неправильно цитируете свои аргументы. Если вы примете предложение @β.εηοιτ.βε и процитируете команду cat, она будет построена так, как ожидалось:

$ docker build -t fastlane-test --build-arg PLAY_STORE_CREDENTIALS = "$(cat PLAY_STORE_CREDENTIALS)" .

[...]

Step 7/7 : RUN cat play-store-credentials.json
 ---> Running in 29f95ee4da19
{ "type": "...", "project_id": "...", "private_key_id": "...", "private_key": "...", "client_email": "...", "client_id": "...", "auth_uri": "...", "token_uri": "...", "auth_provider_x509_cert_url": "...", "client_x509_cert_url": "..." }
Removing intermediate container 29f95ee4da19
 ---> b0fb95a9d894
Successfully built b0fb95a9d894
Successfully tagged fastlane-test:latest

Вы заметите, что полученный файл не сохраняет окончания строк; это потому, что вы не цитируете переменную $PLAY_STORE_CREDENTIALS в своем выражении echo. Вы должны написать это как:

RUN echo "$PLAY_STORE_CREDENTIALS" >> ./play-store-credentials.json

Наконец, непонятно, почему вы передаете эти данные с помощью переменных среды, а не просто с помощью команды COPY:

COPY PLAY_STORE_CREDENTIALS ./play-store-credentials.json

В приведенных выше примерах я тестирую вещи, используя следующий Dockerfile:

FROM docker.io/alpine:latest

ARG PLAY_STORE_CREDENTIALS
ENV PLAY_STORE_CREDENTIALS=$PLAY_STORE_CREDENTIALS
WORKDIR /app/packages/web/android/fastlane/PlayStoreCredentials
RUN touch play-store-credentials.json
RUN echo $PLAY_STORE_CREDENTIALS >> ./play-store-credentials.json
RUN cat play-store-credentials.json

Обновлять

Вот пример использования команды COPY, где значением аргумента сборки PLAY_STORE_CREDENTIALS является имя файла:

FROM docker.io/alpine:latest

ARG PLAY_STORE_CREDENTIALS
WORKDIR /app/packages/web/android/fastlane/PlayStoreCredentials
COPY ${PLAY_STORE_CREDENTIALS} play-store-credentials.json
RUN cat play-store-credentials.json

Если у меня есть учетные данные в файле с именем creds.json, это будет успешно выполнено следующим образом:

docker build -t fastlane-test --build-arg PLAY_STORE_CREDENTIALS=creds.json .

Глядя на это в вашем ответе, touch play-store-credentials.json && echo $PLAY_STORE_CREDENTIALS >> ./play-store-credentials.json кажется излишним (если только OP не делает что-то посреди этого). Таким образом, замена этих двух прогонов одним RUN echo "${PLAY_STORE_CREDENTIALS}" > play-store-credentials.json кажется немного более естественной.

β.εηοιτ.βε 05.05.2022 13:49

Я пытался использовать копию, но после замены PLAY_STORE_CREDENTIALS = "$(cat PLAY_STORE_CREDENTIALS)"PLAY_STORE_CREDENTIALS на PLAY_STORE_CREDENTIALS=$PLAY_STORE_CREDENTIALS я получаю COPY failed: file not found in build context or excluded by .dockerignore: stat var/jenkins_home/workspace/Android-Build-Test@tmp/config3168‌​235257682048127tmp: file does not exist

Hayk Shakhbazyan 05.05.2022 13:50

Но чтобы было ясно, я могу получить доступ к другим файлам с теми же командами, но не к этому файлу JSON. Я также делаю те же процессы для файла .env, и это работает.

Hayk Shakhbazyan 05.05.2022 13:53

Я включил пример использования команды COPY для установки учетных данных в образе.

larsks 05.05.2022 13:55

Хорошо, похоже, это проблема Дженкинса с расширением управляемых файлов, а также с отсутствующими кавычками. Спасибо за помощь

Hayk Shakhbazyan 05.05.2022 14:06

Другие вопросы по теме