3

当使用jib-gradle-plugin构建并推送到 AWS ECR 时,它需要我安装aws ecr credential helper,否则构建会报错“系统没有 docker-credential-ecr-login CLI”

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

安装助手的问题是:

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

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

4

1 回答 1

3

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

使用 Docker 凭证助手与通过 CLI 提供此字符串对没有什么不同。任何凭证助手都将使用“get”命令输出用户名和密码。以 Google Container Registry 为例,

$ 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-usernamemy-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=...)。只要您可以使用凭证助手,我们也不建议这样做。请注意,如果您在命令行上传递凭据,同一系统上的其他用户可以看到该命令(包括凭据),更不用说命令可以记录或存储在 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

于 2020-09-28T15:55:07.020 回答