无法通过 S3 对 Elastic Beanstalk 中的 Docker 进行身份验证

问题描述 投票:0回答:3

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_image.html#docker-singlecontainer-dockerrun-privaterepo

按照此处的说明从 Elastic Beanstalk 连接到私有 docker hub 容器,但它顽固地拒绝工作。在 Docker 1.12 中调用

docker login
时,生成的文件似乎没有 email 属性,但听起来 aws 期望它,所以我创建了一个名为 dockercfg.json 的文件,如下所示:

{
    "https://index.docker.io/v1/": {
        "auth": "Y2...Fz",
        "email": "[email protected]"
    }
}

我的 Dockerrun.aws.json 文件的相关部分如下所示:

  "Authentication": {
    "Bucket": "elasticbeanstalk-us-west-2-9...4",
    "Key": "dockercfg.json"
  },

我已将文件上传到 S3 存储桶的根目录下。为什么我仍然收到这样的错误:

Error: image c...6/w...t:23 not found. Check snapshot logs for details.
我确信名称是正确的,并且如果它是公共存储库,这将起作用。完整的错误如下。我正在使用 Circle CI 从 GitHub 进行部署,如果有影响的话,很乐意提供所需的任何其他信息。

INFO: Deploying new version to instance(s).                         
WARN: Failed to pull Docker image c...6/w...t:23, retrying...
ERROR: Failed to pull Docker image c...6/w...t:23: Pulling repository docker.io/c...6/w...t
Error: image c...6/w...t:23 not found. Check snapshot logs for details.
ERROR: [Instance: i-06b66f5121d8d23c3] Command failed on instance. Return code: 1 Output: (TRUNCATED)...b-project
Error: image c...6/w...t:23 not found
Failed to pull Docker image c...6/w...t:23: Pulling repository docker.io/c...6/w...t
Error: image c...6/w...t:23 not found. Check snapshot logs for details. 
Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/03build.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
INFO: Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
ERROR: Unsuccessful command execution on instance id(s) 'i-06b66f5121d8d23c3'. Aborting the operation.
ERROR: Failed to deploy application.                                

ERROR: Failed to deploy application.

编辑:这是完整的 Dockerrun 文件。请注意,%BUILD_NUM% 只是一个整数,我可以验证它是否有效。

{
  "AWSEBDockerrunVersion": "1",
  "Authentication": {
    "Bucket": "elasticbeanstalk-us-west-2-9...4",
    "Key": "dockercfg.json"
  },
  "Image": {
    "Name": "c...6/w...t:%BUILD_NUM%",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "8080"
    }
  ]
}

编辑:此外,我已经验证如果我公开此 Docker Hub 容器,这将有效。

amazon-web-services docker amazon-s3 amazon-elastic-beanstalk
3个回答
6
投票

好的,我们就这样做吧;

查看同一个文档页面,

对于 Docker 版本 1.6.2 及更早版本,docker login 命令会按以下格式在 ~/.dockercfg 中创建身份验证文件:

{
  "server" :
  {
    "auth" : "auth_token",
    "email" : "email"
  }
}

我明白这部分你已经正确了。请一一仔细核对以下情况;

1) 您是否在同一区域托管 S3 存储桶?

Amazon S3 存储桶必须托管在与存储桶相同的区域中 使用它的环境。 Elastic Beanstalk 无法下载文件 来自其他区域托管的 Amazon S3 存储桶。

2) 您检查过所需的权限吗?

将 s3:GetObject 操作的权限授予 IAM 角色 实例配置文件。详情请参见管理Elastic Beanstalk 实例配置文件

3) 您的配置文件中是否包含 S3 存储桶信息? (我想你也明白了)

将 Amazon S3 存储桶信息包含在

Authentication
(v1) 或
authentication
文件中的
Dockerrun.aws.json
(v2) 参数。

无法查看您的权限或环境区域,因此请仔细检查这些内容。 如果这不起作用,如果可能的话我会升级到 Docker 1.7+ 并使用相应的

~/.docker/config.json
风格。


0
投票

根据您的 Docker 版本,此文件保存为 ~/.dockercfg 或 *~/.docker/config.json

猫~/.docker/config.json

输出:

{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "zq212MzEXAMPLE7o6T25Dk0i"
    }
  }
}

重要:

较新版本的 Docker 创建一个配置文件,如上所示,其中包含 外部身份验证对象Amazon ECS 代理仅支持以下格式的 dockercfg 身份验证数据,不支持 auths 对象。如果您安装了 jq 实用程序,则可以使用以下命令提取此数据:

cat ~/.docker/config.json | jq.auths

输出:

{
  "https://index.docker.io/v1/": {
    "auth": "zq212MzEXAMPLE7o6T25Dk0i",
    "email": "[email protected]"
  }
}
  1. 使用上述内容创建一个名为
    my-dockercfg
    的文件。
  2. 使用 Dockerrun.aws.json 文件中指定的密钥 (
    my-dockercfg
    ) 将文件上传到 S3 存储桶。
{
  "AWSEBDockerrunVersion": 2,
  "authentication": {
    "bucket": "elasticbeanstalk-us-west-2-618148269374",
    "key": "my-dockercfg"
  }
}

0
投票

如果您要升级 Elastic Beanstalk 平台版本,则需要更改 Docker 凭证文件格式(在 S3 存储桶中上传的凭证文件)

旧格式

{
    "server" :
    {
      "auth" : "auth_token",
      "email" : "email"
    }
}

新格式

{
    "auths":{
      "server":{
        "auth":"key"
      }
    }
}

新格式中的“key”与旧格式中的“auth_token”相同。仅 JSON 结构发生了一些变化,不再需要显式的“电子邮件”密钥。

© www.soinside.com 2019 - 2024. All rights reserved.