У меня есть команда сборки докеров, которую я запускаю в оболочке выполнения 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": "..."
}
Есть идеи, где проблема?
@β.εηοιτ.βε Все та же проблема. RUN cat play-store-credentials.json регистрирует пустую строку в jenkins
Было бы полезно, если бы вы предоставили анонимную версию содержания PLAY_STORE_CREDENTIALS
.
@β.εηοιτ.βε Добавил это к вопросу. Ничего особенного с моей точки зрения в json файле
Есть ли на самом деле файл с именем 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
кажется немного более естественной.
Я пытался использовать копию, но после замены 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/config3168235257682048127tmp: file does not exist
Но чтобы было ясно, я могу получить доступ к другим файлам с теми же командами, но не к этому файлу JSON. Я также делаю те же процессы для файла .env, и это работает.
Я включил пример использования команды COPY
для установки учетных данных в образе.
Хорошо, похоже, это проблема Дженкинса с расширением управляемых файлов, а также с отсутствующими кавычками. Спасибо за помощь
Возможно
PLAY_STORE_CREDENTIALS = "$(cat PLAY_STORE_CREDENTIALS)"
чтобы ваша кошка была в безопасности в космосе.