如何在Elastic Beanstalk Docker应用挂载EFS卷?兼容问题排查
解决Elastic Beanstalk(Amazon Linux 2)Docker环境挂载EFS的问题
一、先清理旧配置残留
- 确认部署包已完全移除
.ebextensions文件夹,重新打包后重新部署 - 登录EC2实例手动清理残留文件:
- 执行
sudo rm -f /tmp/mount-efs.sh删除旧脚本 - 检查
/etc/fstab,如果有旧的EFS挂载条目直接删除 - 若已挂载异常路径,执行
sudo umount <挂载路径>卸载后重启实例
- 执行
二、适配Amazon Linux 2的EFS挂载配置
Amazon Linux 2自带amazon-efs-utils工具,无需用Amazon Linux 1的旧脚本,推荐用以下两种方式配置:
方式1:平台钩子(EB官方推荐)
在项目根目录创建.platform/hooks/predeploy文件夹,添加mount-efs.sh脚本:
#!/bin/bash set -e # 替换为你的EFS ID和目标挂载路径 EFS_ID="fs-xxxxxxxxx" MOUNT_DIR="/mnt/efs" # 安装EFS工具(未安装则自动安装) sudo yum install -y amazon-efs-utils # 创建挂载目录 sudo mkdir -p $MOUNT_DIR # 未挂载则执行挂载操作 if ! mount | grep -q $MOUNT_DIR; then sudo mount -t efs $EFS_ID:/ $MOUNT_DIR # 添加到fstab实现开机自动挂载 echo "$EFS_ID:/ $MOUNT_DIR efs defaults,_netdev 0 0" | sudo tee -a /etc/fstab fi
给脚本添加执行权限:chmod +x .platform/hooks/predeploy/mount-efs.sh
方式2:.ebextensions配置
创建.ebextensions/mount-efs.config文件:
commands: 01_install_efs_utils: command: yum install -y amazon-efs-utils 02_create_mount_dir: command: mkdir -p /mnt/efs 03_mount_efs: command: mount -t efs fs-xxxxxxxxx:/ /mnt/efs test: "! mount | grep -q /mnt/efs" 04_fstab_entry: command: echo "fs-xxxxxxxxx:/ /mnt/efs efs defaults,_netdev 0 0" >> /etc/fstab test: "! grep -q 'fs-xxxxxxxxx:/ /mnt/efs' /etc/fstab"
注意替换fs-xxxxxxxxx为你的EFS文件系统ID,/mnt/efs为实际需要的挂载路径。
三、验证挂载效果
部署完成后登录EC2实例,执行以下命令确认:
mount | grep efs:查看是否存在EFS挂载条目df -h:确认挂载路径已显示在磁盘列表中- 在挂载路径写入测试文件,重启实例后检查文件是否保留,验证持久化生效
四、Docker-compose中关联挂载路径
在docker-compose.yml里,将容器内需要持久化的目录映射到EFS挂载路径:
services: your-service: image: your-image volumes: - /mnt/efs/your-data:/container/path/to/data
内容的提问来源于stack exchange,提问作者Salim Fadhley
相关产品推荐
相关产品推荐

