如何使用docker-compose将AWS EFS挂载到Docker容器内?
问题排查与修复方案
核心错误点
- EFS端点拼写错误:你配置中
addr=fs-xxxxxx.efs.useast1.amazonaws.com的区域标识写错,正确AWS区域格式是us-east-1,少了中间的横杠,这是触发invalid argument报错的直接原因。 - 卷驱动类型配置错误:
driver_opts.type不需要写nfs4,直接填nfs即可,NFS版本通过o参数里的nfsvers=4.1指定即可,部分Docker版本对nfs4的类型标识兼容性差。 - 宿主节点缺少NFS依赖:挂载EFS(NFS协议)的操作是Docker daemon在ECS宿主节点层面执行的,你在Dockerfile中安装的依赖仅作用于容器内部,对挂载操作无效,ECS实例宿主需要提前安装NFS客户端工具。
- 安全组策略未放行:如果端点配置正确仍挂载失败,需要检查网络策略:EFS的安全组需要允许ECS实例所在安全组访问TCP 2049端口,ECS实例的安全组需要放通到EFS的TCP 2049端口出站规则,且两者需在同一VPC的可用区内。
注意事项
如果你的ECS使用Fargate启动类型,该方案无法生效:Fargate不支持通过docker-compose自定义本地NFS卷挂载,必须通过任务定义配置EFS挂载。只有EC2启动类型的ECS集群可以用该docker-compose方案。
修改后的配置
docker-compose.yml
version: "3.9" services: server: build: . image: xyz command: "gunicorn -w 4 -k uvicorn.workers.UvicornWorker app.server:server -b 0.0.0.0:8000" volumes: - type: volume source: efs_volume target: /mnt/efs_xyz volumes: efs_volume: driver: local driver_opts: type: "nfs" o: "addr=fs-xxxxxx.efs.us-east-1.amazonaws.com,rw,nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport" device: ":/"
ECS宿主节点前置配置
在ECS实例的启动脚本(UserData)中添加NFS客户端安装命令:
- 若宿主为Amazon Linux 2/CentOS/RHEL:
yum install -y nfs-utils
- 若宿主为Ubuntu/Debian:
apt update && apt install -y nfs-common
内容的提问来源于stack exchange,提问作者toing
相关产品推荐
相关产品推荐

