Jib: как использовать amazon-ecr-credential-helper без его установки?

При использовании jib-gradle-plugin для сборки и отправки на AWS ECR мне требуется установить помощник по учетным данным aws ecr, в противном случае сборка сообщает:"В системе нет интерфейса командной строки docker-credential-ecr-login".

Мне интересно, есть ли способ перейти на AWS ECR без установки помощника по учетным данным, или можно ли связать переносную версию помощника по учетным данным в репо?

Проблемы с установкой помощника:

  1. он требует, чтобы помощник был установлен на каждой машине, на которой должен быть построен проект, что делает процесс сборки не таким автоматизированным, как хотелось бы
  2. Чтобы установить помощник по учетным данным 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, например:

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