我有两个Docker容器。第一个从S3提取文件并将其保存在一个卷中,第二个读取并打印该文件。要共享文件,我正在使用Docker Volume。
现在,当我想在AWS Batch上运行它时,我要在作业定义中定义卷和挂载点。当第一个容器运行时,它将创建一个卷并复制该文件。但随后,它会杀死/删除该卷。因此,现在,第二个容器无法从同一卷访问文件。

AWS Batch文档说,如果我们提供卷的源路径,则该卷将持久存在,但似乎无法正常工作。
什么是实现我目标的正确方法?

最佳答案

目前您还不能。与ECS任务定义不同,批处理作业的作业定义只能包含一个镜像,在ECS任务定义中,您可以有多个容器,这些容器可以共享一个卷。

同样,在批处理作业中,已装入的卷只能基于主机路径。因此,基本上,它们只能是您的计算环境中EC2计算机上的路径。

我可以看到您正在尝试执行的操作的几种方法是:

一种。创建一个可以从S3复制数据并读取和打印的容器。

b。有一个只有一个节点的计算环境,这两个作业都在上面运行。第一个作业将数据复制到计算环境主机上的某个位置。然后第二项工作宣读了这一点。这实际上不是可行的方法,因为您无法潜在地扩展,并且您必须确保以正确的方式设置作业依赖项,以确保先运行复印作业,然后再运行打印作业。

C。使用EFS。基本上创建一个EFS共享位置。然后在批处理作业计算环境中使用启动模板来指定安装EFS的用户数据脚本。然后,第一个作业将数据从主机复制到EFS支持的卷上,第二个作业使用相同的装入点进行读取和打印。在这里,您还需要清楚地设置依赖项。

另一个要考虑的问题是,您是否正在运行多组处理不同数据的作业。如果是,则需要确保在其复制部分中将其复制到打印作业知道并可以读取的子文件夹中。基本上是一个用于创建子文件夹然后从中读取的共享ID,例如,第一个作业传递了data-id = 1234,因此它创建了一个文件夹/ 1234。相同的数据ID传递给第二个作业,它从/ 1234读取。

请注意,默认情况下,EFS会突然通过放置,这可能是一个基于您的工作负荷的问题。而且,如果您最终选择了通过路由进行预配置,那么最终可能会付出高昂的代价。

因此,如果可行的话,总而言之,我建议您选择#1作为解决方案。

关于amazon-web-services - 如何使AWS Batch Volume持久化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57314816/

10-16 07:21