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.sqlr(如-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
相关产品推荐
相关产品推荐

