将Docker映像从私有Docker Registry保存到AWS S3存储桶时出错

我正在尝试设置私人Docker Registry,并将图像保存到AWS S3实例。 registry似乎工作正常 – 它启动好,我可以通过https进行身份validation。 我遇到的问题是我得到一个错误保存到S3,所以我假设有一些权限问题的S3 IAM政策。

docker run命令如下所示:

 docker run -p 443:5000 \ --link redis:redis \ -e REGISTRY_STORAGE=s3 \ -e REGISTRY_STORAGE_S3_BUCKET=my-docker-registry \ -e REGISTRY_STORAGE_S3_ACCESSKEY=**** \ -e REGISTRY_STORAGE_S3_SECRETKEY=**** \ -e REGISTRY_STORAGE_S3_REGION=us-east-1 \ -v `pwd`/auth:/auth \ -e REGISTRY_AUTH=htpasswd \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -v `pwd`/certs:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/my.com_chain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/my.com.key \ -e REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR=redis \ -e REGISTRY_REDIS_ADDR=redis:6379 \ registry:2.5 

S3 IAM策略如下所示:

 { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:ListAllMyBuckets" ], "Resource":"arn:aws:s3:::*" }, { "Effect":"Allow", "Action":[ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource":"arn:aws:s3:::my-docker-registry" }, { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource":"arn:aws:s3:::my-docker-registry/*" } ] } 

错误日志条目是:

 level=error msg="error resolving upload: s3aws: AccessDenied: Access Denied\n\tstatus code: 403, request id: 2B224..." auth.user.name=my-user go.version=go1.6.3 http.request.host=my.domain.com http.request.id=13b79c07-... http.request.method=PATCH http.request.remoteaddr="xx.xx.xx.xx:41392" http.request.uri="/v2/my-test/blobs/uploads/467d94ea-2a77...?_state=zQd-..." http.request.useragent="docker/1.12.0 go/go1.6.3 git-commit/8eab123 kernel/4.4.15-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.0 \\(darwin\\))" instance.id=8a8db6f1-8fe4 vars.name=my-test vars.uuid=467d94ea-2a77 version=v2.5.0 

我在其他应用程序中使用了类似的file upload策略,所以我不确定问题出在哪里。 我需要在IAM策略中更改什么来允许registry保存到S3存储桶?

我计算出来了 – 不确定Docker保存图像文件的方式是否有所改变,但是现在似乎需要将s3:ListBucketMultipartUploads添加到存储区级权限(下面的中间块,IAM完整显示):

 { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:ListAllMyBuckets" ], "Resource":"arn:aws:s3:::*" }, { "Effect":"Allow", "Action":[ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Resource":"arn:aws:s3:::my-docker-registry" }, { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource":"arn:aws:s3:::my-docker-registry/*" } ] } 

似乎现在工作得很好。

接下来的步骤是用上面的docker run args创build一个docker-compose文件,添加一个redis容器,这是一个完整的私人registry解决scheme。

请检查是否将S3 IAMangular色分配给正在使用访问密钥的IAM用户。 您也可以将此angular色分配给EC2实例并避免使用此访问密钥。