Jib — реестр контейнеров Google: не удается пройти аутентификацию в реестре с ошибкой «Невозможно проанализировать ключ json»

# #google-cloud-platform #gitlab-ci #google-container-registry #jib

#google-cloud-platform #gitlab-ci #google-container-registry #jib

Вопрос:

Я хочу поместить свое изображение в реестр контейнеров Google.

Команда, которую я использую (выполняется через Gitlab Ci, переменные работают, тестирование на один этап впереди):

 - mvn compile jib:build -Djib.to.image=$registry 
  -Djib.to.auth.username=_json_key -Djib.to.auth.password=$googleServiceAccount
  

Права учетной записи службы — «Администрирование объекта хранения».

Ошибка: (КСТАТИ: приложение Spring Boot работает — тестирование на этапе)

 Containerizing application to eu.gcr.io/(project-id), eu.gcr.io/(project-id):version...
 [WARNING] Base image 'gcr.io/distroless/java:11' does not use a specific image digest - build may not be reproducible
 [INFO] Using credentials from <to><auth> for eu.gcr.io/(project-id)
 [INFO] Getting manifest for base image gcr.io/distroless/java:11...
 [INFO] Building dependencies layer...
 [INFO] Building resources layer...
 [INFO] Building classes layer...
 [INFO] Using base image with digest: sha256:7fc091e8686df11f7bf0b7f67fd7da9862b2b9a3e49978d1184f0ff62cb673cc
 [INFO] 
 [INFO] ------------------------------------------------------------------------
 [INFO] BUILD FAILURE
 [INFO] ------------------------------------------------------------------------
 [INFO] Total time:  17.432 s
 [INFO] Finished at: 2020-09-08T17:20:30Z
 [INFO] ------------------------------------------------------------------------

Failed to execute goal com.google.cloud.tools:jib-maven-plugin:2.5.2:build (default-cli) on project projektarbeit: Build image failed, perhaps you should make sure your credentials for 'eu.gcr.io/(project-id)' are set up correctly. See https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#what-should-i-do-when-the-registry-responds-with-unauthorized for help: Unauthorized for eu.gcr.io/(project-id): 400 Bad Request
 [ERROR] {"errors":[{"code":"UNKNOWN","message":"Unable to parse json key."}]}
  

В качестве пароля я попытался помимо файла json также проанализировать ключ, начинающийся непосредственно с ‘MIIEv …’. (без n и —BEGIN / END—-)

 "private_key": "-----BEGIN PRIVATE KEY-----nMIIEvQI
  

Я действительно надеюсь, что кто-нибудь сможет помочь мне с этой проблемой.

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

1. Похоже, неправильные учетные данные: Unauthorized for eu.gcr.io/(project-id): 400 Bad Request — вы уверены, что у вас правильные?

Ответ №1:

Значением $googleServiceAccount должно быть содержимое файла ключа JSON (т. Е. Не путь к файлу), например

 {
  "type": "service_account",
  "project_id": "...",
  "private_key_id": "...",
  "private_key": "-----BEGIN PRIVATE KEY-----nMII...",
  "client_email": "....iam.gserviceaccount.com",
  "client_id": "...",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/....iam.gserviceaccount.com"
}
  

И, конечно, содержимое должно быть правильно заключено в кавычки / экранировано при запуске в командной строке.

Как официально задокументировано, например, если бы вы входили в систему локально с docker login , это было бы

 docker login -u _json_key -p "$(cat keyfile.json)" https://[HOSTNAME]
  

Сервер реестра контейнеров Google (GCR) жалуется (400 неверных запросов, что означает, что вы отправили неверный / неожиданный запрос), поскольку он не может проанализировать содержимое $googleServiceAccount в формате JSON.

Поэтому я почти уверен, что вы не предоставляете все содержимое JSON файла ключа, или что-то отсутствует или сломано, что делает его недопустимой структурой JSON. Дважды проверьте файл ключа и содержимое переменной.

Распространенная ошибка заключается в том, что $googleServiceAccount это путь к файлу ключа. В этом случае это может сработать:

 mvn compile jib:build 
  -Djib.to.image=$registry 
  -Djib.to.auth.username=_json_key 
  -Djib.to.auth.password="$( cat $googleServiceAccount )"
  

Обратите "$( cat ... )" внимание, чтобы получить правильно экранированное / заключенное в кавычки содержимое файла в формате JSON.

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

1. Да, я так и думал, поэтому я даже трижды проверил параметр и ключ json, прежде чем публиковать здесь. 🙂 Я думаю, что есть какая-то внутренняя проблема с JIB, что он не может обработать файл json. Но, честно говоря, idk.

2. Я один из разработчиков Jib, и я уверен, что это не проблема с Jib. Jib вообще не обрабатывает строковый литерал, заданный jib.to.auth.password . Значение будет передано в GCR как есть. И, как вы упомянули в другом ответе, я подозреваю, $googleServiceAccount был путь к файлу, а не содержимое JSON.

3. Спасибо за решение. Это намного чище и работает как шарм!

Ответ №2:

Я решил эту проблему с помощью сборки собственного образа docker, который включает

  • Maven
  • JDK
  • Google SDK.
 The command:
 - gcloud auth activate-service-account (service-account) --key-file=$googleServiceAccount
 - gcloud auth configure-docker
 - mvn compile jib:build -Djib.to.image=$registry 
  

Токен, кстати, является файлом, а не ключом

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

1. В случае, когда $googleServiceAccount указан путь к файлу, возможно, это сработает: mvn compile jib:build -Djib.to.image=$registry -Djib.to.auth.username=_json_key -Djib.to.auth.password="$( cat $googleServiceAccount )" . Обратите "$( cat ... )" внимание на получение содержимого файла в формате JSON.