Windows 10下Docker Compose加载Postgres容器外部sh脚本遇语法错误
我之前在Windows 10环境下折腾Postgres容器外部sh脚本的时候,也踩过一模一样的坑——语法报错+Docker Compose加载失败。结合踩坑经验,给你梳理几个最可能的解决方向:
1. 先搞定换行符问题(90%的语法错误根源)
Windows系统默认用CRLF(\r\n)作为换行符,但Linux容器里的bash只认LF(\n),这是最容易触发Syntax error: unexpected end of file或者\r: command not found这类错误的原因。
解决办法:
- 用Notepad++打开你的sh脚本:点击右下角的「CRLF」选项,切换成「LF」,再保存脚本。
- 如果脚本在Git仓库里,可通过Git全局配置自动转换:
git config --global core.autocrlf input,之后重新拉取或保存脚本即可。 - 要是你用自定义Dockerfile构建镜像,也可以加一行转换命令:
RUN sed -i 's/\r$//' /path/to/your/script.sh
2. 排查Docker Compose的挂载配置
Docker Compose加载失败大多是路径格式不对或者权限不足:
路径格式问题
Windows下的路径要注意转义:
- 用正斜杠替换反斜杠:比如本地脚本路径是
D:\postgres-scripts\init.sh,在docker-compose.yml里要写成:services: postgres: image: postgres:latest volumes: - D:/postgres-scripts/init.sh:/docker-entrypoint-initdb.d/init.sh entrypoint: ["/bin/bash", "/docker-entrypoint-initdb.d/init.sh"] - 或者用双反斜杠转义:
D:\\postgres-scripts\\init.sh
权限与执行方式
Linux容器里的脚本需要执行权限,你可以:
- 借助WSL给本地脚本加执行权限:打开WSL终端,运行
chmod +x /mnt/d/postgres-scripts/init.sh(注意替换成你的实际路径)。 - 或者直接在
docker-compose.yml里指定用bash执行脚本,绕开权限检查:entrypoint: ["bash", "/docker-entrypoint-initdb.d/init.sh"]
3. 检查脚本本身的语法
如果前面两步都没问题,那就要排查脚本自身的写法:
- 第一行必须加shebang:
#!/bin/bash,告诉容器用bash解释执行脚本,不能漏。 - 确保所有符号都是英文半角:比如引号、括号、分号,别不小心用了中文符号。
- 先在WSL里测试脚本:运行
bash init.sh,看会不会抛出同样的错误,本地测试能更快定位语法问题。
4. 替换入口点的关键注意事项
如果你是替换Postgres的默认入口点,一定要在脚本末尾调用官方的入口逻辑,否则Postgres服务不会启动。比如在你的脚本最后加上:
# 执行完自定义逻辑后,启动Postgres服务 exec docker-entrypoint.sh postgres
内容的提问来源于stack exchange,提问作者Harsh Lodhi
相关产品推荐
相关产品推荐

