如何设置需要访问s3并将推送到ECS中运行的ECR的dockerfile

如何设置需要访问s3并将推送到ECS中运行的ECR的dockerfile,docker,dockerfile,amazon-iam,amazon-ecs,amazon-ecr,Docker,Dockerfile,Amazon Iam,Amazon Ecs,Amazon Ecr,我是docker和AWS ECR&ECS服务的新手 我有一个在本地运行的小型web scraper映像,现在我正在尝试将其移动到AWS web scraper结果将保存在a.txt中,该文件已移动到s3,因此web scraper应用程序需要在开始时读取a.txt,然后进行修改,最后进行更新。更具体地说: dockerfile中的以下脚本将数据从s3移动到容器中: from python:3.7-slim run aws s3 cp s3://bucket_name/path_to_a.txt

我是docker和AWS ECR&ECS服务的新手

我有一个在本地运行的小型web scraper映像,现在我正在尝试将其移动到AWS

web scraper结果将保存在a.txt中,该文件已移动到s3,因此web scraper应用程序需要在开始时读取a.txt,然后进行修改,最后进行更新。更具体地说: dockerfile中的以下脚本将数据从s3移动到容器中:

from python:3.7-slim
run aws s3 cp s3://bucket_name/path_to_a.txt local_path_to_a.txt
然后,app.py将读取数据并进行处理。代码结束时,以下脚本将更新s3中的a.txt:

boto3.resource('s3').Bucket(bucket_name).upload_file(local_path_to_a.txt, s3://bucket_name/path_to_a.txt)
这是我当前的工作流程,所以简言之,dockerfile需要将文件从s3复制到容器中,脚本app.py将写回

现在我陷入了这个问题: 要在本地构建映像以推入ECR,我需要向aws授予dockerfile访问权限:

# syntax = docker/dockerfile:experimental
run --mount=type=secret,id=aws,target=/root/.aws/credentials \
aws s3 cp s3://bucket_name/path_to_a.txt local_path_to_a.txt

因此,我的问题是,这是在ECR+ECS中工作的正确方式吗?我知道我可能需要通过设置IAM角色来授予容器访问权限,但是,我仍然需要在本地无错误地构建映像,这需要从本地计算机进行aws访问。

我认为更好的工作流是创建一个只包含执行以下操作的Python应用程序的容器映像:

  • 将数据从S3复制到容器
  • 处理容器中的数据以生成新的数据版本
  • 将(新)数据从容器放回S3
为此,您需要两个宏工作流:

  • 建立图像并将其推送到ECR的人。您可以在本地(您的笔记本电脑需要有CRED才能推送到ECR)或通过
    code构建
    (构建项目需要有一个与之关联的IAM角色,可以推送到ECR)这样的服务来完成此操作
  • 第二个工作流包括部署一个ECS任务,该任务将提取容器映像并运行它。ECS任务需要有一个IAM角色,允许它从ECR中提取(除了读/放到S3之外)

  • 要使AWS命令正常工作,您需要在docker映像内设置AWS访问密钥和密钥,这些密钥可以通过env变量接收。但这不是推荐的最佳做法


    如果您正在自动化该过程,那么您可以在docker build之前使用具有适当IAM角色的EC2实例或代码构建从S3下载文件

    您真的需要在构建时将文件复制到映像中吗?或者这是应该在运行时发生的事情吗?@larsks,一个很好的例子,我可以调整以在运行时读取数据。我想更多地了解这个问题的答案,以了解上述过程是否有效,以及如何有效。或者,您是否建议数据转换和交互应该/通常只在运行时而不是构建时进行?这更多的是关于您项目的体系结构的问题:如果数据是相对静态的,那么您不需要不断构建新的映像来合并更改的数据,在构建时复制数据可能是有意义的。但是,如果数据是动态的,那么将获取委托给运行时可能更有意义,这样您就可以继续使用单个图像。