ElasticBeanstalk - 无法从私有 Docker Hub 存储库中提取 docker 映像

Posted

技术标签:

【中文标题】ElasticBeanstalk - 无法从私有 Docker Hub 存储库中提取 docker 映像【英文标题】:ElasticBeanstalk - cannot pull docker image from private Docker Hub repo 【发布时间】:2021-01-05 08:36:56 【问题描述】:

我正在将 docker 映像部署到 ElasticBeanstalk(使用 CodePipeline)。我的Dockerrun.aws.json 看起来像这样:


  "AWSEBDockerrunVersion": "1",
  "Authentication": 
    "Bucket": "mybucket",
    "Key": "docker_hub_auth.json"
  ,
  "Image": 
    "Name": "repo/image:tag",
    "Update": "true"
  ,
  "Ports": [
    
      "ContainerPort": "8080"
    
  ]

我收到来自 ElasticBeanstalk 实例的错误:Failed to pull Docker image repo/image:tag: Error response from daemon: pull access denied for repo/image, repository does not exist or may require 'docker login': denied: requested access to the resource is denied. Check snapshot logs for details. (Executor::NonZeroExitStatus)

当我 ssh 到实例时,我可以检查 auth 文件 docker_hub_auth.json 正在成功下载。令我惊讶的是,该文件被下载到/root/.dockercfg(来自03build.sh 通过download_auth.py)。然后docker pull 被调用。但我假设 docker 期望在/root/.docker/config.json 中进行身份验证!

当我在实例上手动执行 docker login 时,它会将 Docker Hub 身份验证添加到 /root/.docker/config.json 并部署开始工作。但显然我需要在没有手动 docker login 的情况下使其工作,以防我的实例被替换或新实例启动。

对我来说这似乎是一个错误。我能做些什么?自动脚本将身份验证下载到/root/.dockercfg,但 docker(Docker 版本 19.03.6-ce,内部版本 369ce74)需要在/root/.docker/config.json 中使用它。有什么建议可以克服吗?

更新,已解决

A 已迁移到 Amazon Linux 2,现在它可以工作了。

【问题讨论】:

嗨,我遇到了类似的问题,文件正确存储在 /root/.docker/config 上,并检查了我的 cloudwatch 日志,存储桶中的身份验证文件已正确下载,但我没有似乎无法找到它在 Linux 操作系统上的存储位置。你是怎么发现你的在那个目录上的?谢谢 03build.sh 脚本将身份验证文件从 S3 下载到 /root/.dockercfg。然后它运行docker pull,然后删除.dockercfg。我已经建立了与实例的 ssh 连接,并且在 CodePipeline 的部署阶段每秒手动执行sudo cat /root/.dockercfg。在某一时刻,文件内容被打印到控制台。 我看到你更新到 Solved。好消息!如果您能支持我的回答,我将不胜感激 @FaridHajnal - 您建议使用 Amazon Linux。你说错误发生在 Amazon Linux 2 上。但是我有完全相反的经验。抱歉,无法投票。 【参考方案1】:

我尝试了一个非常相似的问题。几个月前,我配置了一个运行 Docker 的 Elastic Beanstalk 环境,并从一个私有 Docker Hub 存储库中提取了一个映像,这与 Bitbucket Pipeline 的实现一样好。 今天,我尝试为不同的项目再次执行相同的完全相同的过程,但我无法让它运行,收到同样的错误:Failed to pull Docker image repo/image:tag: Error response from daemon: pull access denied for repo/image, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.

就我而言,解决方案是终止我的环境并使用最新的在 64 位 Amazon Linux 上运行的 Docker 版本创建一个新环境;在我的情况下 2.15.4.

这个 docker private repos 的身份验证错误似乎发生在 Docker running on 64bit Amazon Linux 2 上,可能需要使用 ebextensions 设置一些额外的配置或某物。由于此平台分支的当前版本是 3.1.2

但是,我希望有人也可以通过确保将此 Docker-Linux 版本用于您的 Elastic Beanstalk 环境来解决他们的问题

【讨论】:

看来问题不仅与 Amazon Linux 2 有关。我的环境是Docker running on 64bit Amazon Linux/2.15.4。由于另一个错误,我不得不放弃 Amazon Linux 2。 知道了。这就是我的解决方案,但我希望你能尽快找到你的解决方案【参考方案2】:

您可以使用ebextensions 运行bash 命令 将文件移动到所需位置。

根据下载文件的时间,您可以使用Commands 或Container commands 来执行此操作。或者,您也可以使用platform hooks。

【讨论】:

好的。 auth 文件正在/opt/elasticbeanstalk/hooks/appdeploy/pre/03build.sh 文件中下载。在同一个文件中,docker pull 被调用并返回错误。这意味着我需要在 03build.sh 运行之前将身份验证文件下载到正确的位置。你会把它放在哪里?

以上是关于ElasticBeanstalk - 无法从私有 Docker Hub 存储库中提取 docker 映像的主要内容,如果未能解决你的问题,请参考以下文章

Elastic beanstalk 实例无法访问私有 S3 文件

在没有公有子网的私有子网中运行 Amazon ElasticBeanstalk 实例

无法使用 Terraform 在自定义 VPC 中创建 Elastic Beanstalk 应用程序

无法访问 Elastic Beanstalk IP 地址之一?

为 Elastic Beanstalk 上的 github 私有存储库访问设置 SSH 密钥

具有私有存储库的 Elastic Beanstalk 多容器 Docker CannotPullContainerError