# #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.