Jib:如何在不安装的情况下使用 amazon-ecr-credential-helper?

Xin*_*hao 7 gradle docker amazon-ecr jib aws-credentials

当使用jib-gradle-plugin构建并推送到 AWS ECR 时,它要求我安装aws ecr 凭证助手,否则构建会抱怨“系统没有 docker-credential-ecr-login CLI”

我想知道是否有一种方法可以在不安装凭证助手的情况下推送到 AWS ECR,或者是否可以在存储库中捆绑凭证助手的便携式版本?

安装助手的问题是:

  1. 它需要在需要构建项目的每台机器上安装助手,因此使得构建流程不像我希望的那样自动化
  2. 要安装 aws ecr 凭证帮助程序,需要安装 Docker。这感觉有点讽刺,因为 Jib 的很大一部分要点是构建发生的主机上不需要 Docker,因此构建可以是独立的和可移植的。

我知道这不是 Jib 问题,但我只是希望使用 Jib 的人可能遇到类似的挑战,因此可以提供一些有关如何解决该问题的见解。

Cha*_* Oh 8

最后,使用注册表进行身份验证都归结为向 Jib 提供一个简单的用户名/密码字符串对。一旦 Jib 检索到该对,Jib 就将用户名和密码字符串按原样传递到服务器,而不进行任何处理。(顺便说一句,这种机制并不是 Jib 特有的;每个 Docker 注册表都以这种方式工作。)就是这么简单:用户名和密码对才是最重要的。

使用 Docker 凭证帮助程序与通过 CLI 提供此字符串对没有什么不同。任何凭证助手都会使用“get”命令输出用户名和密码。例如,使用 Google 容器注册表,

$ docker-credential-gcr get <<<gcr.io
{"ServerURL":"","Username":"... this is the username ...","Secret":"... this is the password ..."}
Run Code Online (Sandbox Code Playgroud)

因此,理论上您可以编写一个始终输出一些用户名/密码、命名文件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

$ docker-credential-gcr get <<<gcr.io
{"ServerURL":"","Username":"... this is the username ...","Secret":"... this is the password ..."}
Run Code Online (Sandbox Code Playgroud)

(如果您对 进行 base64 解码bXktdXNlcm5hbWU6bXktcGFzc3dvcmQ=,则会生成my-username:my-password纯字符串。)这意味着,如果您可以docker pull/push在某些系统上工作,Jib 也可以工作(正如 Jib 所研究的那样~/.docker/config.json)。因此,向 Jib 提供凭据的另一种方法是~/.docker/config.json在系统上创建一个工作(或者您可以从成功运行的另一个系统复制它docker login)。这种方法,除非可以安全地完成,否则我也不会这样做。

再举一个例子,~/.docker/config您还可以通过jib.{from|to}.auth.{username|password}(也可以通过相应的系统属性来设置,例如-Djib.from.auth.username=...)将您的凭证直接传递给 Jib,而不是使用愚蠢的凭证助手或间接方式。只要您可以使用凭据助手,我们也不推荐这样做。请注意,如果您在命令行上传递凭据,同一系统上的其他用户可以看到该命令(包括凭据),更不用说命令可以记录或存储在 shell 历史记录中。build.gradle在某些环境中,如果您将这些凭据存储在某些环境变量中并修改您的或从环境变量中pom.xml读取,则可以减轻此命令行风险。jib.{from|to}.auth.{username|password}

有关提供用户名/密码对的方法的完整列表,您可以查阅官方常见问题解答

另请注意,您认为正确的用户名和密码对可能不是您的注册表实际接受的用户名和密码对。例如,该 AWS ECR 用户错误地认为他们可以使用“AWS ECR 密钥用户”(无论它是什么)作为用户名,而实际上,作为用户名docker-credential-ecr-login返回。AWS(并不是说您总是必须用AWS作用户名;ECR 可能(也可能没有)具有多种形式的可接受的凭据。)

最后,我会向 AWS ECR 社区或您使用 Jib 的平台社区确认,如果您无法使用凭证助手。例如,对于 GitHub Actions,之前我成功使用了aws-actions/amazon-ecr-login