You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:40:34