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

Docker Compose初始化PostgreSQL时SQL表未创建问题排查

PostgreSQL容器初始化:数据库创建成功但未生成数据表,日志出现"received fast shutdown request"

问题背景

使用docker-compose初始化PostgreSQL容器,编写了SQL初始化文件用于创建数据库和数据表。实际运行后,数据库成功创建,但数据表未生成,同时日志中出现"received fast shutdown request"错误。

错误日志

Attaching to pgadmin, postgres
postgres  | The files belonging to this database system will be owned by user "postgres".
postgres  | This user must also own the server process.
postgres  | 
postgres  | The database cluster will be initialized with locale "en_US.utf8".
postgres  | The default database encoding has accordingly been set to "UTF8".
postgres  | The default text search configuration will be set to "english".
postgres  | 
postgres  | Data page checksums are disabled.
postgres  | 
postgres  | fixing permissions on existing directory /var/lib/postgresql/data ... ok
postgres  | creating subdirectories ... ok
postgres  | selecting dynamic shared memory implementation ... posix
postgres  | selecting default max_connections ... 100
postgres  | selecting default shared_buffers ... 128MB
postgres  | selecting default time zone ... Etc/UTC
postgres  | creating configuration files ... ok
postgres  | running bootstrap script ... ok
postgres  | performing post-bootstrap initialization ... ok
postgres  | initdb: warning: enabling "trust" authentication for local connections
postgres  | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
postgres  | syncing data to disk ... ok
postgres  | 
postgres  | 
postgres  | Success. You can now start the database server using:
postgres  | 
postgres  |     pg_ctl -D /var/lib/postgresql/data -l logfile start
postgres  | 
postgres  | waiting for server to start....2023-07-28 20:58:38.129 UTC [49] LOG:  starting PostgreSQL 15.3 (Debian 15.3-1.pgdg120+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
postgres  | 2023-07-28 20:58:38.130 UTC [49] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres  | 2023-07-28 20:58:38.133 UTC [52] LOG:  database system was shut down at 2023-07-28 20:58:38 UTC
postgres  | 2023-07-28 20:58:38.136 UTC [49] LOG:  database system is ready to accept connections
postgres  |  done
postgres  | server started
postgres  | CREATE DATABASE
postgres  | 
postgres  | 
postgres  | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
postgres  | CREATE DATABASE
postgres  | CREATE SCHEMA
postgres  | psql:/docker-entrypoint-initdb.d/init.sql:13: NOTICE:  schema "public" already exists, skipping
postgres  | COMMENT
postgres  | GRANT
postgres  | GRANT
postgres  | CREATE TABLE
postgres  | ALTER TABLE
postgres  | CREATE TABLE
postgres  | ALTER TABLE
postgres  | CREATE TABLE
postgres  | ALTER TABLE
postgres  | CREATE INDEX
postgres  | CREATE TABLE
postgres  | ALTER TABLE
postgres  | CREATE INDEX
postgres  | CREATE INDEX
postgres  | 
postgres  | 
postgres  | waiting for server to shut down...2023-07-28 20:58:38.338 UTC [49] LOG:  received fast shutdown request
postgres  | .2023-07-28 20:58:38.338 UTC [49] LOG:  aborting any active transactions
postgres  | 2023-07-28 20:58:38.342 UTC [49] LOG:  background worker "logical replication launcher" (PID 55) exited with exit code 1
postgres  | 2023-07-28 20:58:38.344 UTC [50] LOG:  shutting down
postgres  | 2023-07-28 20:58:38.345 UTC [50] LOG:  checkpoint starting: shutdown immediate
postgres  | 2023-07-28 20:58:38.388 UTC [50] LOG:  checkpoint complete: wrote 1847 buffers (11.3%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.022 s, sync=0.020 s, total=0.044 s; sync files=502, longest=0.006 s, average=0.001 s; distance=8544 kB, estimate=8544 kB
postgres  | 2023-07-28 20:58:38.398 UTC [49] LOG:  database system is shut down
postgres  |  done
postgres  | server stopped
postgres  | 
postgres  | PostgreSQL init process complete; ready for start up.
postgres  | 
postgres  | 2023-07-28 20:58:38.458 UTC [1] LOG:  starting PostgreSQL 15.3 (Debian 15.3-1.pgdg120+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
postgres  | 2023-07-28 20:58:38.458 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres  | 2023-07-28 20:58:38.458 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres  | 2023-07-28 20:58:38.459 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres  | 2023-07-28 20:58:38.462 UTC [67] LOG:  database system was shut down at 2023-07-28 20:58:38 UTC
postgres  | 2023-07-28 20:58:38.482 UTC [1] LOG:  database system is ready to accept connections

SQL初始化文件

CREATE DATABASE "FleetManagement"
    WITH
    OWNER = admin
    ENCODING = 'UTF8'
    LC_COLLATE = 'en_US.utf8'
    LC_CTYPE = 'en_US.utf8'
    TABLESPACE = pg_default
    CONNECTION LIMIT = -1
    IS_TEMPLATE = False;

CREATE SCHEMA IF NOT EXISTS public
    AUTHORIZATION pg_database_owner;

COMMENT ON SCHEMA public
    IS 'standard public schema';

GRANT USAGE ON SCHEMA public TO PUBLIC;

GRANT ALL ON SCHEMA public TO pg_database_owner;


CREATE TABLE IF NOT EXISTS public."DeliveryPoints"
(
    "Id" integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
    "DeliveryPointName" text COLLATE pg_catalog."default" NOT NULL,
    "Value" integer NOT NULL,
    CONSTRAINT "PK_DeliveryPoints" PRIMARY KEY ("Id")
)

    TABLESPACE pg_default;

ALTER TABLE IF EXISTS public."DeliveryPoints"
    OWNER to admin;

CREATE TABLE IF NOT EXISTS public."Logs"
(
    "Id" integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
    "Barcode" text COLLATE pg_catalog."default" NOT NULL,
    "State" integer NOT NULL,
    "DeliveryPointValue" integer NOT NULL,
    CONSTRAINT "PK_Logs" PRIMARY KEY ("Id")
)

    TABLESPACE pg_default;

ALTER TABLE IF EXISTS public."Logs"
    OWNER to admin;


CREATE TABLE IF NOT EXISTS public."Sacks"
(
    "Id" integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
    "Barcode" text COLLATE pg_catalog."default" NOT NULL,
    "State" integer NOT NULL,
    "DeliveryPointId" integer NOT NULL,
    CONSTRAINT "PK_Sacks" PRIMARY KEY ("Id"),
    CONSTRAINT "FK_Sacks_DeliveryPoints_DeliveryPointId" FOREIGN KEY ("DeliveryPointId")
        REFERENCES public."DeliveryPoints" ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE CASCADE
)

    TABLESPACE pg_default;

ALTER TABLE IF EXISTS public."Sacks"
    OWNER to admin;
-- Index: IX_Sacks_DeliveryPointId

-- DROP INDEX IF EXISTS public."IX_Sacks_DeliveryPointId";

CREATE INDEX IF NOT EXISTS "IX_Sacks_DeliveryPointId"
    ON public."Sacks" USING btree
        ("DeliveryPointId" ASC NULLS LAST)
    TABLESPACE pg_default;


-- Table: public.Packages

-- DROP TABLE IF EXISTS public."Packages";

CREATE TABLE IF NOT EXISTS public."Packages"
(
    "Id" integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
    "Desi" integer NOT NULL,
    "Barcode" text COLLATE pg_catalog."default" NOT NULL,
    "State" integer NOT NULL,
    "DeliveryPointId" integer NOT NULL,
    "SackId" integer NOT NULL DEFAULT 0,
    CONSTRAINT "PK_Packages" PRIMARY KEY ("Id"),
    CONSTRAINT "FK_Packages_DeliveryPoints_DeliveryPointId" FOREIGN KEY ("DeliveryPointId")
        REFERENCES public."DeliveryPoints" ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE CASCADE,
    CONSTRAINT "FK_Packages_Sacks_SackId" FOREIGN KEY ("SackId")
        REFERENCES public."Sacks" ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE CASCADE
)

    TABLESPACE pg_default;

ALTER TABLE IF EXISTS public."Packages"
    OWNER to admin;
-- Index: IX_Packages_DeliveryPointId

-- DROP INDEX IF EXISTS public."IX_Packages_DeliveryPointId";

CREATE INDEX IF NOT EXISTS "IX_Packages_DeliveryPointId"
    ON public."Packages" USING btree
        ("DeliveryPointId" ASC NULLS LAST)
    TABLESPACE pg_default;
-- Index: IX_Packages_SackId

-- DROP INDEX IF EXISTS public."IX_Packages_SackId";

CREATE INDEX IF NOT EXISTS "IX_Packages_SackId"
    ON public."Packages" USING btree
        ("SackId" ASC NULLS LAST)
    TABLESPACE pg_default;

docker-compose配置文件

services:

postgres:
  container_name: postgres
  image: postgres
  environment:
    POSTGRES_USER: ${POSTGRES_USER:-admin}
    POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-fatih}
    PGDATA: /data/postgres
  volumes:
    - ./Distribute.Api/init.sql:/docker-entrypoint-initdb.d/init.sql
  ports:
    - "5432:5432"
  restart: on-failure:10

pgadmin:
  container_name: pgadmin
  image: dpage/pgadmin4
  environment:
    PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-admin@admin.com}
    PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-fatih}
    PGADMIN_CONFIG_SERVER_MODE: 'False'
  ports:
    - "${PGADMIN_PORT:-5050}:80"
  depends_on:
    - postgres

问题分析与解决

1. "received fast shutdown request"错误原因

该日志是PostgreSQL官方镜像的正常初始化流程,并非异常:

  • 容器启动时会先启动临时数据库服务,执行/docker-entrypoint-initdb.d/目录下的初始化脚本
  • 脚本执行完成后,临时服务会被关闭,随后启动正式的数据库服务对外提供连接
    因此这个日志无需处理,属于正常流程环节。

2. 数据表未生成的原因

从日志可以看到SQL脚本的CREATE TABLE语句已执行,但数据表未出现在FleetManagement数据库中,核心原因是初始化脚本默认在postgres默认数据库中执行,所有表都被创建在了postgres数据库的public schema下,而非目标数据库FleetManagement。

解决方法

有两种可行方案:

方案一:修改SQL脚本切换数据库

在CREATE DATABASE语句之后,添加切换数据库的命令,确保后续表创建操作在目标库中执行:

\c "FleetManagement";

方案二:通过环境变量指定默认数据库

在docker-compose的postgres服务环境变量中添加POSTGRES_DB,让容器直接以FleetManagement作为默认数据库,这样初始化脚本会直接在该库中执行,无需手动切换:

environment:
  POSTGRES_USER: ${POSTGRES_USER:-admin}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-fatih}
  PGDATA: /data/postgres
  POSTGRES_DB: FleetManagement

这种情况下,SQL脚本中可以删除CREATE DATABASE语句,避免重复创建数据库的提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:44:50