Rails Docker项目的entrypoint.sh文件应该放置在哪个目录?
你遇到的构建报错核心原因是本地项目根目录下未创建entrypoint.sh文件,Docker构建时会从执行build命令的上下文(你这里就是项目根目录)读取要复制的文件,找不到对应文件就会抛出该错误。
关于你的两个疑问先明确说明:
- 脚本头部的
#!/bin/bash是声明该脚本的解释器路径,和脚本本身的存放位置无关联,不需要把脚本放到/bin目录下。 - Dockerfile中
COPY entrypoint.sh /usr/bin/的含义是:把本地上下文的entrypoint.sh文件复制到镜像内的/usr/bin目录下,该配置本身没问题,因为/usr/bin默认在系统PATH中,后续ENTRYPOINT可以直接调用脚本。
正确配置步骤
1. 本地创建entrypoint.sh文件
在你的项目根目录(和Dockerfile、Gemfile平级的AppName目录下)新建entrypoint.sh文件,注意修正文件内的路径适配你的WORKDIR配置:
#!/bin/bash set -e # 移除Rails可能残留的server.pid文件 rm -f /app/tmp/pids/server.pid # 执行容器主进程(对应Dockerfile里的CMD配置) exec "$@"
注:原脚本中的/myapp路径要改为/app,因为你的Dockerfile中指定了WORKDIR为/app,否则启动时会找不到pid文件路径
2. 无需修改现有Dockerfile配置
你当前的Dockerfile已经包含了赋予执行权限、配置ENTRYPOINT的逻辑,不需要额外调整。
3. 重新执行构建命令
docker build -t rails-docker .
即可正常完成构建。
额外注意事项
- 如果是在Windows环境下创建的sh文件,需要将文件的换行符格式设置为LF,不要使用Windows默认的CRLF,否则容器运行时会报脚本解析错误。
- 不需要在本地给entrypoint.sh赋予执行权限,Dockerfile中的
RUN chmod +x /usr/bin/entrypoint.sh会在镜像构建阶段自动处理权限。
内容的提问来源于stack exchange,提问作者axelmukwena
相关产品推荐
相关产品推荐

