Docker PostgreSQL容器仅首个SQL脚本执行,后续脚本未运行排查
PostgreSQL Docker容器中第二个初始化脚本未执行的问题排查与解决
核心问题分析
从日志/usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*可明确:Postgres官方镜像的初始化脚本目录仅在首次创建数据库(数据卷为空)时执行一次。若数据卷已存在(比如之前启动过容器并执行过第一个脚本),后续启动容器会直接跳过该目录下的所有脚本,这是第二个脚本未运行的根本原因。
另外,即使脚本被执行,默认SQL脚本会连接到POSTGRES_DB指定的数据库,而非你创建的cloud_parking_db,这也可能导致表创建在错误的库中,看起来像是脚本未执行。
解决方案
1. 重置数据卷(适用于测试/数据可重置场景)
若可清除现有数据库数据,直接删除关联数据卷,让容器重新初始化:
docker-compose down -v docker-compose up -d
此操作会彻底删除容器和数据卷,重新启动时会执行/docker-entrypoint-initdb.d/下的所有脚本。
2. 修正第二个脚本的数据库连接目标
确保第二个脚本连接到cloud_parking_db,有两种方式:
- 在
01_create-tables.sql开头添加切换数据库的命令:\c cloud_parking_db; -- 示例创建表语句 CREATE TABLE IF NOT EXISTS parking_spots ( id SERIAL PRIMARY KEY, spot_number INT NOT NULL, is_occupied BOOLEAN DEFAULT FALSE ); - 重命名脚本为
01_create-tables.cloud_parking_db.sql,官方镜像会自动识别后缀中的数据库名,执行时自动连接到该库。
3. 自定义初始化逻辑(适用于需重复执行脚本的场景)
若需要每次启动容器都执行脚本(需保证脚本幂等,比如用CREATE TABLE IF NOT EXISTS),可自定义entrypoint逻辑,等待数据库就绪后执行第二个脚本:
修改docker-compose.yml中的postgres服务配置:
services: postgres: build: ./pg-server ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: your_password POSTGRES_DB: default_db healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 entrypoint: /bin/sh -c " # 启动Postgres服务 docker-entrypoint.sh postgres & # 等待数据库就绪 until pg_isready -U postgres; do sleep 1; done; # 执行第二个脚本 psql -U postgres -d cloud_parking_db -f /docker-entrypoint-initdb.d/01_create-tables.sql; # 等待Postgres进程 wait " volumes: postgres_data:
内容的提问来源于stack exchange,提问作者Mauricio Gracia Gutierrez
相关产品推荐
相关产品推荐

