基于Debian 11的Dockerfile执行entrypoint.sh提示文件未找到求助
问题解决思路
你的核心问题是容器启动时找不到entrypoint.sh脚本,结合你的Dockerfile和错误信息,以下是针对性的解决步骤:
1. 修复ENTRYPOINT与CMD的冲突配置
Docker中同时指定ENTRYPOINT和CMD时,CMD的内容会作为ENTRYPOINT的参数传递。你当前的配置会导致容器执行:
/tmp/rails/entrypoint.sh /bin/bash -c /tmp/rails/entrypoint.sh
这完全不符合预期,必须二选一:
- 保留ENTRYPOINT(推荐exec格式):
ENTRYPOINT ["/tmp/rails/entrypoint.sh"] # 无需额外CMD,若需传参数可在CMD中指定 - 保留CMD:
# 删除ENTRYPOINT行 CMD ["/bin/bash", "-c", "/tmp/rails/entrypoint.sh"]
2. 检查脚本行尾格式(最常见原因)
如果你的entrypoint.sh是在Windows环境下编辑的,行尾会是CRLF格式,而Linux容器仅识别LF。bash执行时会把CR字符当成路径的一部分,实际寻找的是/tmp/rails/entrypoint.sh\r,自然找不到。
解决方法:
- 用编辑器转换:比如VS Code右下角点击
CRLF切换为LF - 在Dockerfile中添加转换步骤:
RUN apt-get install -y dos2unix && dos2unix /tmp/rails/entrypoint.sh
3. 简化脚本拷贝逻辑
你的Dockerfile中重复拷贝了entrypoint.sh,容易导致路径混乱,建议简化为一次处理:
# 拷贝整个项目到/tmp/rails RUN mkdir /tmp/rails COPY . /tmp/rails WORKDIR "/tmp/rails" # 直接给脚本加执行权限 RUN chmod +x ./entrypoint.sh
删除后续单独拷贝entrypoint.sh的步骤。
4. 验证容器内路径正确性
可以临时修改Dockerfile,启动时进入bash手动排查:
CMD ["bash"]
启动容器后执行:
ls -l /tmp/rails/entrypoint.sh
确认文件是否存在、是否有执行权限。
额外:修复entrypoint.sh逻辑错误
即使脚本能正常找到,你的脚本还有几个逻辑问题:
nginx -g 'daemon off;'会让nginx前台运行,后续命令永远无法执行service nginx start与前台nginx进程冲突- 拼写错误:
RAILS_ENV=proudction应为production
修正后的示例:
#!/bin/bash # 后台启动nginx service nginx start # 切换到rails项目目录 cd /tmp/rails # 前台启动rails服务(维持容器运行) RAILS_ENV=production bundle exec rails server -p 3000
内容的提问来源于stack exchange,提问作者simo
相关产品推荐
相关产品推荐

