Docker Compose部署PostgreSQL时初始化表失败(权限异常)
PostgreSQL容器初始化脚本权限拒绝问题解决
问题分析
从日志可见,容器启动时执行/docker-entrypoint-initdb.d/init.sql时报Permission denied——即便本地已给文件设置777权限。核心原因有两点:
- Alpine版PostgreSQL容器默认以
postgres用户(固定UID=999)运行,部分系统的SELinux策略或Docker挂载权限映射,会限制容器内非root用户访问挂载的本地文件; - 初始化脚本仅在首次创建数据库卷时执行,若之前已启动过容器,后续启动不会重新触发脚本执行。
解决方案
1. 调整本地init.sql文件属主
执行命令将文件属主改为容器内postgres用户对应的UID:
sudo chown 999:999 ./docker/init.sql
2. 重置数据库卷(关键步骤)
因为旧卷已经跳过了初始化流程,必须删除现有卷后重新启动:
# 停止容器并删除关联卷 docker compose down -v # 重新启动容器 docker compose up -d
3. 优化init.sql脚本(可选)
由于POSTGRES_DB已指定默认数据库matcha,初始化脚本会自动连接该库,可删除多余的切换命令,简化脚本:
CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, name VARCHAR(100), username VARCHAR(50) UNIQUE NOT NULL );
验证
启动容器后查看日志,若出现以下内容则表示脚本执行成功:
postgres | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql postgres | CREATE TABLE
此时通过Adminer连接数据库,即可看到users表已创建。
内容的提问来源于stack exchange,提问作者rayankb92
相关产品推荐
相关产品推荐

