Docker PostgreSQL entrypoint-initdb.d指定初始化SQL执行数据库问题
问题原因
官方PostgreSQL Docker镜像的docker-entrypoint-initdb.d目录下的初始化脚本,默认会执行到POSTGRES_USER环境变量对应的同名数据库中,你当前配置里POSTGRES_USER=root,所以init.sql默认执行到了root库。
解决方案(二选一即可)
方案1:修改init.sql文件,显式指定执行数据库
在init.sql开头添加切换数据库的语句即可,修改后内容如下:
\c postgres; CREATE TABLE accounts ( user_id serial PRIMARY KEY, username VARCHAR ( 50 ) UNIQUE NOT NULL, password VARCHAR ( 50 ) NOT NULL, email VARCHAR ( 255 ) UNIQUE NOT NULL, created_on TIMESTAMP NOT NULL, last_login TIMESTAMP ); insert into accounts(username,password,email,created_on) values ('a','aaa','assdfdas',now());
方案2:修改docker-compose.yml配置,指定默认初始化数据库
在postgres服务的environment配置块中新增POSTGRES_DB=postgres参数,即可指定初始化脚本默认执行到postgres库,修改后的docker-compose.yml对应部分如下:
version: '3' services: postgres: image: postgres:13.1 healthcheck: test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ] timeout: 45s interval: 10s retries: 10 restart: always environment: - POSTGRES_USER=root - POSTGRES_PASSWORD=password - POSTGRES_DB=postgres # 新增这行配置 - APP_DB_USER=docker - APP_DB_PASS=docker - APP_DB_NAME=docker volumes: - ./db:/docker-entrypoint-initdb.d/ ports: - 5432:5432
注意事项
修改配置后需要先清空之前初始化生成的数据库卷,否则初始化脚本不会重复执行,执行以下命令即可:
docker-compose down -v
之后再重新执行docker-compose up即可生效。
内容的提问来源于stack exchange,提问作者Vulwsztyn
相关产品推荐
相关产品推荐

