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

使用Docker Compose创建PostgreSQL数据库失败求助

PostgreSQL容器初始化脚本执行失败(Is a directory错误)解决办法

问题场景

Windows11环境下,通过docker-compose启动PostgreSQL容器时,挂载的init.sql初始化脚本被容器识别为目录,触发报错:

psql:/docker-entrypoint-initdb.d/init.sql: error: could not read from input file: Is a directory

解决步骤

1. 清理旧容器与挂载残留

彻底清理已创建的容器和关联卷,避免旧挂载状态干扰:

docker-compose down -v

2. 验证本地文件有效性

在Windows命令行进入Backend目录,执行命令确认init.sql是文件而非目录:

dir postgresql

输出中需确保init.sql的类型为「文件」,而非<DIR>。

3. 修正Docker-compose配置

端口配置修正

PostgreSQL默认监听端口为5432,原配置中容器内端口写为5444会导致服务无法正常对外提供,需修正:

ports:
  - 5444:5432  # 宿主机5444端口映射到容器内默认5432端口

补充网络与卷定义

显式声明网络和卷,避免隐式创建的潜在问题:

# 在docker-compose.yml末尾添加
networks:
    des-erp:
        driver: bridge

volumes:
    postgres_data:

4. 开启Docker文件共享权限

打开Docker Desktop,进入设置 -> 资源 -> 文件共享,勾选当前存放项目的磁盘(如C盘),保存后重启Docker。

5. (WSL2后端用户)调整文件权限

若使用WSL2作为Docker后端,进入WSL终端切换到项目目录,执行命令赋予脚本可读权限:

chmod 644 postgresql/init.sql

修正后的完整docker-compose.yml

version: '3'

services: 
    postgresql:
        image: postgres:alpine
        container_name: postgresql
        networks:
            - des-erp
        env_file:
            - ./postgresql/database.env
        ports:
            - 5444:5432
        volumes:
            - ./postgresql/init.sql:/docker-entrypoint-initdb.d/init.sql
            - postgres_data:/var/lib/postgresql/data

networks:
    des-erp:
        driver: bridge

volumes:
    postgres_data:

错误原因说明

Windows环境下,若Docker无法正确访问本地挂载的文件(如文件共享未开启、路径解析错误),会自动将容器内的挂载目标创建为目录,导致初始化脚本无法被识别为文件执行。

内容的提问来源于stack exchange,提问作者roderknight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:35:26