我正在Amazon EC2上运行docker-container。目前我已经将AWS凭证添加到Dockerfile。你能告诉我最好的方法吗?


当前回答

如果有人在遵循已接受答案中提到的说明后仍然面临同样的问题,那么请确保您没有传递来自两个不同来源的环境变量。在我的情况下,我通过文件和参数传递环境变量到docker运行,这导致作为参数传递的变量显示没有影响。

所以下面的命令对我没用:

docker run --env-file ./env.list -e AWS_ACCESS_KEY_ID=ABCD -e AWS_SECRET_ACCESS_KEY=PQRST IMAGE_NAME:v1.0.1

将aws凭证移动到提到的env。列表文件帮助。

其他回答

还有一种方法是在docker-compose.yaml中创建临时只读卷。AWS CLI和SDK(如boto3或AWS SDK for Java等)正在~/中寻找默认配置文件。aws /凭证文件。

如果要使用其他配置文件,在执行docker-compose命令之前,还需要导出AWS_PROFILE变量。

出口AWS_PROFILE = some_other_profile_name

version: '3'

services:
  service-name:
    image: docker-image-name:latest
    environment:
      - AWS_PROFILE=${AWS_PROFILE}
    volumes:
      - ~/.aws/:/root/.aws:ro

在这个例子中,我在docker上使用root用户。如果您正在使用其他用户,只需更改/root/。Aws到用户主目录。

:ro -只读docker卷

当您在~/中有多个概要文件时,这是非常有用的。aws/凭证文件,您也在使用MFA。如果你想在ECS上部署docker-container之前对它进行本地测试(在ECS上你有IAM角色,但在本地你没有),这也是有帮助的。

根据之前的一些回答,我建立了自己的答案如下。 我的项目结构:

├── Dockerfile
├── code
│   └── main.py
├── credentials
├── docker-compose.yml
└── requirements.txt

我的docker-compose。yml文件:

version: "3"

services:
  app:
    build:
      context: .
    volumes:
      - ./credentials:/root/.aws/credentials
      - ./code:/home/app

我的Docker文件:

FROM python:3.8-alpine

RUN pip3 --no-cache-dir install --upgrade awscli

RUN mkdir /app
WORKDIR /home/app

CMD python main.py

卷挂载在这个线程中被注意到,但是从docker-compose v3.2 +开始,你可以绑定挂载。

例如,如果你在项目的根目录下有一个名为.aws_creds的文件:

在你的compose文件服务中,对卷执行以下操作:

volumes:
     # normal volume mount, already shown in thread
  - ./.aws_creds:/root/.aws/credentials
    # way 2, note this requires docker-compose v 3.2+
  - type: bind                         
    source: .aws_creds              # from local
    target: /root/.aws/credentials  # to the container location

使用这个想法,你可以在docker-hub上公开存储你的docker映像,因为你的aws凭证不会在映像中…要使它们相关联,你必须在容器启动的地方有正确的本地目录结构(即从Git中提取)

即使我的凭证是由aws-okta或saml2aws设置的,以下一行程序也适用于我:

$ docker run -v$HOME/.aws:/root/.aws:ro \
            -e AWS_ACCESS_KEY_ID \
            -e AWS_CA_BUNDLE \
            -e AWS_CLI_FILE_ENCODING \
            -e AWS_CONFIG_FILE \
            -e AWS_DEFAULT_OUTPUT \
            -e AWS_DEFAULT_REGION \
            -e AWS_PAGER \
            -e AWS_PROFILE \
            -e AWS_ROLE_SESSION_NAME \
            -e AWS_SECRET_ACCESS_KEY \
            -e AWS_SESSION_TOKEN \
            -e AWS_SHARED_CREDENTIALS_FILE \
            -e AWS_STS_REGIONAL_ENDPOINTS \
            amazon/aws-cli s3 ls 

请注意,对于高级用例,您可能需要允许rw(读写)权限,因此在-v$HOME/.aws:/root/.aws:ro中挂载.aws卷时忽略ro(只读)限制

另一种方法是将密钥从主机传递到docker容器。您可以在docker-compose文件中添加以下代码行。

services:
  web:
    build: .
    environment:
      - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
      - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}