将Docker容器部署到ECS Fargate时启动脚本找不到的问题求助
问题分析与解决方案
问题根源
你遇到的start.sh not found报错,核心原因是EFS卷挂载覆盖了容器镜像中原有的目录:
你的ECS配置里将EFS卷挂载到了/srv/src/enketo_express/,这会完全替换容器镜像里该目录下的所有内容。而EFS根目录指向的/volumes/enketo/config中,并没有setup/docker/start.sh这个路径,因此启动时找不到脚本。
可行解决方案
1. 调整挂载路径(推荐)
不要将EFS挂载到整个/srv/src/enketo_express/目录,只挂载需要自定义配置的子目录。比如Enketo通常仅需挂载config目录来覆盖配置文件:
修改容器定义中的mountPoints:
"mountPoints": [ { "sourceVolume": "config", "containerPath": "/srv/src/enketo_express/config", "readOnly": false } ],
这样既保留了镜像中原有的setup/docker/start.sh脚本,又能使用EFS里的自定义配置。
2. 同步启动脚本到EFS
如果必须挂载整个/srv/src/enketo_express/目录,需要把镜像中的setup/docker/start.sh文件同步到EFS的/volumes/enketo/config/setup/docker/路径下,同时确保文件拥有执行权限:
# 本地从镜像复制启动脚本目录 docker run --rm -v $(pwd):/tmp enketo/enketo-express:6.0.0 cp -r /srv/src/enketo_express/setup /tmp/ # 将复制的setup目录上传到EFS对应路径(可通过EC2挂载EFS后复制,或使用AWS CLI工具)
3. 使用镜像默认启动命令
查看该镜像的Dockerfile可知,默认启动流程通过docker-entrypoint.sh完成,无需手动指定command。你可以尝试移除容器定义中的entryPoint和command配置,让容器使用镜像默认的启动逻辑,避免手动指定路径引发的问题。
内容的提问来源于stack exchange,提问作者twoLeftFeet
相关产品推荐
相关产品推荐

