启动Nginx Docker容器时出现/docker-entrypoint.sh不存在错误
解决Docker启动Nginx容器时/docker-entrypoint.sh不存在的问题
你遇到的错误属于典型的「文件存在但无法执行」场景,核心原因通常是脚本行尾格式不兼容或权限配置缺失,以下是具体排查和解决方法:
1. 修复脚本的行尾换行符
如果你的docker-entrypoint.sh是在Windows环境下创建的,默认会使用CRLF(\r\n)作为换行符,但Linux容器仅识别LF(\n)。此时容器执行脚本时会把行尾的\r当成文件名的一部分,实际寻找的是/docker-entrypoint.sh\r,自然提示文件不存在。
解决方式:
- 用文本编辑器(VS Code、Notepad++等)打开脚本,将换行格式切换为LF:
- VS Code:点击右下角的「CRLF」,选择「LF」
- Notepad++:依次点击「编辑」→「文档格式转换」→「转为UNIX格式」
- 或者在Dockerfile中添加自动修复命令,在COPY脚本后执行:
COPY --chown=oracle:oracle docker-entrypoint.sh / RUN sed -i 's/\r$//' /docker-entrypoint.sh # 移除所有行尾的\r字符
2. 赋予脚本执行权限
即使文件存在,没有执行权限也可能触发类似错误(部分场景下权限不足会被系统伪装成「文件不存在」)。在Dockerfile中添加权限设置:
COPY --chown=oracle:oracle docker-entrypoint.sh / RUN chmod +x /docker-entrypoint.sh
3. 调整USER指令的位置
当前Dockerfile中ENTRYPOINT定义在USER之前,但容器执行ENTRYPOINT时会使用后续切换的oracle用户。如果脚本需要执行一些依赖root权限的初始化操作,可能会因权限不足导致执行失败。可以将USER ${USER}移到ENTRYPOINT之后(适用于脚本无需root权限的场景):
COPY --chown=oracle:oracle docker-entrypoint.sh / RUN chmod +x /docker-entrypoint.sh ENTRYPOINT ["/docker-entrypoint.sh"] USER ${USER} WORKDIR /app STOPSIGNAL SIGQUIT EXPOSE 8000 CMD ["nginx", "-g", "daemon off;"]
验证步骤
修改后重新构建并启动容器测试:
docker build -t my-nginx-image . docker run -d -p 8000:8000 my-nginx-image
内容的提问来源于stack exchange,提问作者Aman Anand
相关产品推荐
相关产品推荐

