Docker Compose自动创建PostgreSQL bank数据库报错求助
解决PostgreSQL容器自动创建bank数据库的问题
问题根源
你自定义的command覆盖了PostgreSQL容器的默认启动逻辑——容器没有启动PostgreSQL服务,只在循环执行pg_isready检测,自然会出现no response错误。官方PostgreSQL容器的默认启动流程会自动处理服务启动、初始化等操作,不要轻易覆盖command。
两种可行解决方案
方案1:直接设置默认数据库为bank(最简单)
如果你的需求就是把bank作为默认数据库,只需在environment中添加POSTGRES_DB变量:
修改docker-compose.yml的环境变量部分:
environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=bank # 添加这一行 - PGDATA=/data/postgres
注意:如果之前已经启动过容器并生成了数据卷,需要先清理旧数据(执行
docker-compose down -v),否则PostgreSQL不会重新初始化,环境变量不生效。
方案2:保留默认数据库,额外自动创建bank库(官方推荐)
如果需要保留以用户名命名的默认数据库,同时自动创建bank,使用官方提供的初始化脚本机制:
- 在项目根目录创建
init-scripts文件夹,里面新建create-bank-db.sql文件,内容如下:
CREATE DATABASE bank;
- 修改docker-compose.yml的
volumes部分,将脚本目录挂载到容器的初始化目录:
volumes: - db:/data/postgres - ./init-scripts:/docker-entrypoint-initdb.d # 添加这一行
容器启动时,会自动执行/docker-entrypoint-initdb.d下的所有SQL/Shell脚本,且是在PostgreSQL服务完全启动后执行,无需手动写等待逻辑。
为什么之前的POSTGRES_DB不生效?
因为你的docker-compose配置中根本没有添加POSTGRES_DB环境变量,PostgreSQL默认会以POSTGRES_USER的值作为默认数据库名。添加上述方案1中的变量即可解决。
内容的提问来源于stack exchange,提问作者Jotter Kain
相关产品推荐
相关产品推荐

