我们能否在AWS ECS Docker容器上挂载EFS?

8
我有一台ECS实例,我的docker容器正在其中运行。我想在运行在ECS上的docker容器上挂载EFS。如果可能的话,如何操作?
我可以将EFS挂载到ECS实例上,但无法将其挂载到在ECS上运行的docker容器上。
EFS通过直接连接设置,并且可以从docker telnet到2049端口。
使用以下命令进行挂载:mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 X.X.X.X:/ /efs
错误信息为:mount.nfs4: Operation not permitted
3个回答

21

更新:2020年1月17日 - 预览ECS / EFS支持

2020年1月17日,AWS 宣布了ECS支持EFS的预览版。需要注意的是,这是目前的预览版发布;请参阅配置文档中有关其含义的信息。

您可以简单地定义新的EFSVolumeConfiguration对象,而不是定义卷及其所有连接参数。

"EFSVolumeConfiguration": {
  "fileSystemId": "fs-xxxxxx",
  "rootDirectory": "/mnt/volume/path"
}

原始答案

截至2018年8月,使用docker卷支持,您现在可以将NFS共享直接挂载到ECS容器中。

目前可用的文档没有详细说明如何通过docker卷在ECS中使用EFS,但是这是可能的。

配置docker卷

首先,在任务配置中包含一个类似以下内容的volumes部分:

"volumes": [
   {
     "name": "efs",
     "host": null,
     "dockerVolumeConfiguration": {
       "autoprovision": null,
       "labels": null,
       "scope": "task",
       "driver": "local",
       "driverOpts": {
         "type": "nfs",
         "device": ":/",
         "o": "addr=<fs-id>.efs.us-east-1.amazonaws.com,nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport"
       }
     }
   }
]

请确保你更新 o 选项内的 addr 参数以匹配你的 EFS 文件系统的 DNS 名称。

接下来,在你的容器定义中,将这个卷包含在一个挂载点中。有关语法的更多信息,请参见 Docker Volumes

"containerDefinitions": [
    {
        "mountPoints": [
            {
                "sourceVolume": "efs",
                "containerPath": "/path/to/mount_volume",
                "readOnly": false
            }
        ]
    }
]

正在使用的NFS连接配置选项是AWS在撰写时推荐用于挂载EFS文件系统的选项。


我希望我能为你的这个点赞更多。太棒了! - Victor Schröder
这适用于由AWS Batch自动生成的任务定义吗?据我所知,不适用。 - Sagi Mann

4

谢谢@Sudharsan。我已经成功地配置了它。我从你的答案中得到了提示和适当的解决方法。参考网址:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_efs.html - mahendra rathod
注意:上述配置仅适用于 ECS 上的 EC2 启动类型。对于 Fargate,您必须使用 efsVolumeConfiguration。 - Peter P.

0

方法1: 当您想要将EFS挂载到EC2实例并使所有容器使用它时。 运行以下命令将EFS挂载到EC2实例。

sudo mount -t efs fs-0ad7c287c2f7c27c2 /mnt/efs

然后在任务定义中将其作为sourcePath引用,以便容器可以使用efs挂载路径作为可写层。

"volumes": [
 {
  "name": "efs",
  "host": {
    "sourcePath": "/mnt/efs/mysql"
   }
 }
]

方法二: 当在ECS上启用自动扩展时,最好将EFS卷直接附加到ECS任务/容器上。 在任务定义中按照以下方式进行说明,以便容器在生成时直接挂载EFS。

"volumes": [
    {
        "name": "Tiger-Test",
        "efsVolumeConfiguration": {
        "fileSystemId": "fs-0ad7c287c2f7c27c2"
        }
    }
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接