Jib: как использовать amazon-ecr-credential-helper без его установки?
При использовании jib-gradle-plugin для сборки и отправки на AWS ECR мне требуется установить помощник по учетным данным aws ecr, в противном случае сборка сообщает:"В системе нет интерфейса командной строки docker-credential-ecr-login".
Мне интересно, есть ли способ перейти на AWS ECR без установки помощника по учетным данным, или можно ли связать переносную версию помощника по учетным данным в репо?
Проблемы с установкой помощника:
- он требует, чтобы помощник был установлен на каждой машине, на которой должен быть построен проект, что делает процесс сборки не таким автоматизированным, как хотелось бы
- Чтобы установить помощник по учетным данным aws ecr, необходимо установить Docker. Это кажется немного ироничным, потому что большая часть точки Jib заключается в том, что Docker не требуется на хосте, на котором происходит сборка, поэтому сборка может быть автономной и переносимой.
Я знаю, что это не проблема Jib, но я просто надеюсь, что тот, кто использует Jib, мог столкнуться с аналогичными проблемами и поэтому может предложить некоторые идеи, как их обойти.
2 ответа
В конце концов, все сводится к предоставлению Jib простой пары строки имени пользователя и пароля. Как только Jib извлекает пару, Jib просто передает строковые литералы имени пользователя и пароля на сервер как есть, без какой-либо обработки.
Использование помощника по учетным данным Docker ничем не отличается от предоставления этой пары строк через интерфейс командной строки. Любой помощник по учетным данным выведет имя пользователя и пароль с помощью команды "get". Например, с помощью реестра контейнеров Google,
$ docker-credential-gcr get <<<gcr.io
{"ServerURL":"","Username":"... this is the username ...","Secret":"... this is the password ..."}
Итак, теоретически вы можете написать тупой скрипт или двоичный файл, который всегда выводит какое-то имя пользователя / пароль, назовите файл
docker-credential-my-dumb-script
и настроить
jib.{from|to}.credHelper='my-dumb-script'
. Но я бы не стал этого делать; это просто для того, чтобы подчеркнуть, что речь идет только о предоставлении Jib пары имени пользователя и пароля.
Однако обратите внимание, что многие помощники по учетным данным динамически генерируют краткосрочные учетные данные, срок действия которых скоро истекает, что намного безопаснее, чем использование статических и постоянных учетных данных. Это одна из причин, по которой мы обычно рекомендуем по возможности использовать помощник по учетным данным.
Другой пример
docker login
. Например, успешный вход с
docker login chanseoktest.azurecr.io -u my-username -p my-password
просто приводит к записи
my-username
и
my-password
в
~/.docker/config.json
:
"auths": {
"chanseoktest.azurecr.io": {
# <username>:<password> in PLAIN string in base64 encoded form
"auth": "bXktdXNlcm5hbWU6bXktcGFzc3dvcmQ="
},
(Если вы делаете base64-decode на
bXktdXNlcm5hbWU6bXktcGFzc3dvcmQ=
, это приводит к
my-username:my-password
в простой строке.) Это означает, что если вы можете сделать
docker pull/push
работать на какой-то системе, Jib также будет работать (поскольку Jib смотрит в
~/.docker/config.json
). Следовательно, другим способом предоставить учетные данные Jib было бы создание рабочего
~/.docker/config.json
в системе (или вы можете скопировать его из другой системы, где вы успешно запустили
docker login
). Такого подхода я бы тоже не стал.
В качестве еще одного примера вместо тупого помощника по учетным данным или
~/.docker/config
косвенно, вы также можете напрямую передать свои учетные данные в Jib через
jib.{from|to}.auth.{username|password}
(который также может быть установлен через соответствующие системные свойства, например,
-Djib.from.auth.username=...
). Мы также не рекомендуем этого делать, если вы можете использовать помощник по учетным данным. Имейте в виду, что если вы передадите учетные данные в командной строке, другие пользователи в той же системе смогут увидеть команду (включая учетные данные), не говоря уже о том, что команды могут регистрироваться.
Полный список способов указать пару имени пользователя и пароля вы можете найти в официальном FAQ.
Также обратите внимание, что то, что вы считаете правильной парой имени пользователя и пароля, может не соответствовать действительности, которую ваш реестр принимает. Например, этот пользователь AWS ECR ошибочно предположил, что он может использовать "ключевого пользователя AWS ECR" (что бы это ни было) в качестве имени пользователя, тогда как в действительности
docker-credential-ecr-login
вернулся
AWS
как имя пользователя. (Не то чтобы вам всегда приходилось использовать
AWS
как имя пользователя; ECR может (или не может) иметь несколько форм приемлемых учетных данных.)
Наконец, я хотел бы получить подтверждение у сообщества AWS ECR или сообщества платформы, на которой вы используете Jib, чтобы выяснить, какую форму учетных данных лучше всего использовать в качестве пары имени пользователя и пароля для "входа в Docker", если вы не можете использовать учетный помощник. Например, для GitHub Actions ранее я успешно использовал https://github.com/aws-actions/amazon-ecr-login.
Вам не нужноdocker
должен быть установлен, чтобы иметьamazon-ecr-credential-helper
работать с .Jib
просто автоматически выберет учетные данные и будет использовать их для отправки образа без докера.
Вам просто нужно использоватьsetCredHelper("ecr-login")
в конфигурации плагина jib, например: