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