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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:22:48