2016-08-07 26 views
11

Tôi đang cố thiết lập một Docker Registry riêng và lưu hình ảnh vào thể hiện AWS S3. Registry dường như hoạt động tốt - nó khởi động ok và tôi có thể xác thực nó trên https. Vấn đề tôi gặp phải là tôi đang gặp lỗi khi lưu vào S3, vì vậy tôi cho rằng có một số vấn đề về quyền với chính sách S3 IAM.Lỗi khi lưu hình ảnh Docker vào thùng AWS S3 từ Docker Registry riêng

Lệnh docker run trông như thế này:

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 

Và chính sách S3 IAM trông như thế này:

{ 
    "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/*" 
     } 
    ] 
} 

Mục log lỗi là:

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 

Tôi đã đã sử dụng chính sách tương tự cho tải lên tệp trong các ứng dụng khác, vì vậy tôi không chắc chắn vấn đề ở đâu. Tôi cần phải thay đổi gì trong chính sách IAM để cho phép đăng ký lưu vào nhóm S3?

+0

Bạn có thể đề cập đến sổ đăng ký nào bạn đang sử dụng không? Dịch vụ Container Đàn hồi? –

+0

Tôi đang sử dụng đăng ký của riêng mình, Dockerfile đang ở trong bài đăng. – ldg

Trả lời

6

I figured it out - không chắc chắn nếu có điều gì thay đổi với cách Docker tiết kiệm tập tin hình ảnh nhưng có vẻ như bây giờ bạn cần phải thêm s3:ListBucketMultipartUploads cho phép xô cấp (khối trung dưới đây, IAM thể hiện đầy đủ cho đầy đủ):

{ 
    "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/*" 
     } 
    ] 
} 

Dường như hoạt động tốt ngay bây giờ.

Các bước tiếp theo là tạo tệp docker-compose với số docker run args ở trên, thêm vùng chứa redis vào đó và đó là giải pháp đăng ký riêng tư đầy đủ.

1

Vui lòng kiểm tra xem vai trò IAM S3 được gán cho người dùng IAM có khóa truy cập đang được sử dụng hay không. Bạn cũng có thể gán vai trò này cho cá thể EC2 và tránh sử dụng khóa truy cập này.

+0

Cảm ơn @ shankar-p-s - nó hoạt động nếu tôi thay đổi IAM Actions thành ký tự đại diện '*', mà tôi không muốn làm, tôi chỉ cần tìm ra sự cho phép mà tôi đang thiếu và ở đâu. Không chắc chắn tôi có thể gán vai trò cho cá thể EC2 kể từ khi tôi đang chạy đăng ký trong một container, và cũng muốn nó được di động. – ldg

Các vấn đề liên quan