Docker Compose中PostgreSQL Schema及表未创建问题求助
问题诊断与解决步骤
核心问题
PostgreSQL容器的初始化脚本默认在postgres系统数据库中执行,你创建了caillou数据库,但后续的Schema和表创建语句没有切换到该数据库,导致所有对象都被创建在postgres库中,而非目标caillou库。
解决方案
1. 修改db.sql脚本,切换到目标数据库执行后续语句
在创建caillou数据库之后,添加切换数据库的命令,确保后续Schema和表都创建在caillou中:
CREATE USER sa WITH PASSWORD 'admin'; CREATE DATABASE caillou; GRANT CONNECT ON DATABASE caillou TO sa; -- 关键:切换到caillou数据库 \connect caillou; -- 后续的Schema和表创建语句... CREATE SCHEMA IF NOT EXISTS app; SET search_path TO pg_catalog,public,app; ALTER SCHEMA app OWNER TO sa; GRANT USAGE ON SCHEMA app TO sa; -- 剩余脚本内容保持不变...
2. 清理已存在的数据卷(如果之前容器已启动过)
PostgreSQL容器会检测数据卷是否有初始化数据,如果已有数据,会跳过/docker-entrypoint-initdb.d/下的脚本执行。所以需要清理旧数据卷:
# 停止并删除容器及关联数据卷 docker-compose down -v # 重新构建并启动容器 docker-compose up --build
3. 验证Adminer的连接配置
使用Adminer连接数据库时,确保:
- 数据库名称填
caillou - 用户名填
sa,密码填admin - 主机地址填
db(Docker Compose中定义的数据库服务名)
额外检查点
- 查看数据库容器日志,确认初始化脚本是否执行成功:
docker-compose logs db
日志中若出现running /docker-entrypoint-initdb.d/db.sql字样,说明脚本已执行,可进一步查看是否有错误信息。
- 确保
db.sql文件权限正常,Docker COPY操作默认会赋予容器内postgres用户可读权限,无需额外配置。
内容的提问来源于stack exchange,提问作者Apollo
相关产品推荐
相关产品推荐

