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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:33:28