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

postgres:9.6镜像中/docker-entrypoint-initdb.d脚本未执行问题求助

Postgres初始化脚本未执行的排查与解决

1. 核心原因:数据卷已存在旧数据

Postgres官方镜像的初始化逻辑仅在PGDATA目录为空时才会执行/docker-entrypoint-initdb.d/下的脚本。你的Compose配置使用了命名卷db_data:/var/lib/postgresql/data,如果之前启动过容器,卷中已经存储了Postgres的数据库文件,脚本就不会重复执行。

解决方法:

  • 删除现有关联卷:
    docker-compose down -v
    
  • 重新构建并启动容器:
    docker-compose up --build db
    

2. 验证PGDATA目录配置

你设置了PGDATA: "/var/lib/postgresql/data/pgdata",这个目录是挂载卷的子目录,需确认:

  • 首次启动时/var/lib/postgresql/data/pgdata确实为空
  • 卷目录权限允许postgres用户(UID 999)写入

可进入容器检查:

docker exec -it <容器ID> bash
ls -la /var/lib/postgresql/data/pgdata

3. 简化Dockerfile冗余配置

官方postgres镜像已默认设置ENTRYPOINT ["docker-entrypoint.sh"]和CMD ["postgres"],重复指定无必要,优化后Dockerfile:

FROM postgres:9.6
COPY init.sql /docker-entrypoint-initdb.d/
USER root
RUN chown postgres:postgres /docker-entrypoint-initdb.d/init.sql

4. 检查脚本语法与权限

  • 验证脚本语法正确性:手动复制到容器内执行测试
    docker cp init.sql <容器ID>:/tmp/
    docker exec -it <容器ID> psql -U postgres -f /tmp/init.sql
    
  • 确认脚本可读性:postgres用户需拥有读权限
    docker exec -it <容器ID> ls -la /docker-entrypoint-initdb.d/init.sql
    
    权限包含r(如-rw-r--r--)即可,无需执行权限。

5. 通过日志定位问题

查看容器启动日志,确认初始化流程:

docker-compose logs db
  • 脚本执行成功会显示running /docker-entrypoint-initdb.d/init.sql
  • PGDATA非空会提示PostgreSQL Database directory appears to contain a database; Skipping initialization

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:20:28