如何使AWS Batch Volume持久化?

时间:2019-08-01 18:14:20

标签: amazon-web-services docker amazon-ec2 amazon-ecs aws-batch

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

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

1 个答案:

答案 0 :(得分:1)

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

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

我可以看到您正在尝试做的事情的几种方法是:

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

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

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

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

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

所以总的来说,如果可行的话,我会推荐#1作为解决方法。

相关问题