Windows Docker Desktop运行Nginx容器时docker-entrypoint.sh找不到求助
解决Docker容器中docker-entrypoint.sh提示找不到的问题
针对你遇到的问题——文件存在且权限正常但仍提示找不到,可尝试以下几种排查和解决方法:
1. 检查脚本是否带有UTF-8 BOM头
Windows下编辑的文件常带有UTF-8 BOM头,Alpine的Shell无法识别这种格式,会导致脚本的shebang(#!/bin/sh)失效,系统误判为文件找不到。
- 进入容器后执行命令查看文件开头:
hexdump -C /docker-entrypoint.sh | head -1 - 如果输出开头是
ef bb bf 23 21 2f 62 69,说明存在BOM头。解决方法:用VS Code等编辑器打开脚本,选择"UTF-8 without BOM"格式重新保存后再构建镜像。
2. 替换脚本的shebang为Alpine原生Shell路径
Alpine默认的sh是ash的软链接,但直接指定#!/bin/ash可能避免兼容性问题:
修改docker-entrypoint.sh的第一行为:
#!/bin/ash
3. 调整Dockerfile中COPY指令的顺序
当前Dockerfile中先执行COPY ["./", "./"]将本地所有文件复制到/my-project,虽然之后单独复制了脚本到根目录,但如果本地根目录存在同名文件(比如误把脚本放在项目根目录),可能出现意外覆盖。建议将单独复制脚本的指令提前:
# 先复制脚本到根目录 COPY ["./docker/old/nginx/scripts/docker-entrypoint.sh", "/docker-entrypoint.sh"] RUN chmod +x /docker-entrypoint.sh # 再复制项目文件 COPY ["./", "./"] COPY ["./docker/old/nginx/config/nginx.${BUILD_ENV}.conf", "/etc/nginx/nginx.conf"]
4. 修改ENTRYPOINT的执行格式
尝试将ENTRYPOINT的数组格式改为Shell执行格式,避免路径解析问题:
ENTRYPOINT ["sh", "/docker-entrypoint.sh"] # 或者使用Shell格式 # ENTRYPOINT /docker-entrypoint.sh
5. 替换脚本中的[[语法为[]
部分Alpine版本的ash对[[的支持有限,可将脚本中所有的[[替换为[,]]替换为],比如:
# 原代码 if [[ "${GROUP_ID}" != $(id -g nginx) ]]; then # 修改后 if [ "${GROUP_ID}" != "$(id -g nginx)" ]; then
内容的提问来源于stack exchange,提问作者user20918430
相关产品推荐
相关产品推荐

