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

Docker中初始化EdgeDB失败:root用户执行pg_ctl报错

解决EdgeDB通过Docker Compose部署时pg_ctl: cannot be run as root错误

问题描述

通过Docker Compose部署EdgeDB,执行命令edgedb project init --server-instance project --non-interactive时触发错误,核心提示为pg_ctl: cannot be run as root,要求以非特权用户执行操作。完整错误输出如下:

root@edgedb:/project# edgedb project init --server-instance project --non-interactive
Found `edgedb.toml` in /project
Initializing project...
Checking EdgeDB versions...
┌────────────────────────┬──────────────────────┐
│ Project directory      │ /project             │
│ Project config         │ /project/edgedb.toml │
│ Schema dir (non-empty) │ /project/dbschema    │
│ Installation method    │ portable package     │
│ Version                │ 5.4+427a7f2          │
│ Instance name          │ project              │
└────────────────────────┴──────────────────────┘
Version 5.4+427a7f2 is already downloaded
Initializing EdgeDB instance...
[edgedb] ---- Exception occurred: /root/.local/share/edgedb/portable/5.4/bin/pg_ctl exited with status 1:
[edgedb]     pg_ctl: cannot be run as root
[edgedb]     Please log in (using, e.g., "su") as the (unprivileged) user that will
[edgedb]     own the server process. ----
[edgedb] 
[edgedb] 1. edb.server.pgcluster.ClusterError: /root/.local/share/edgedb/portable/5.4/bin/pg_ctl exited with status 1:
[edgedb]     pg_ctl: cannot be run as root
[edgedb]     Please log in (using, e.g., "su") as the (unprivileged) user that will
[edgedb]     own the server process.
[edgedb] 
[edgedb] ---- Traceback ----
[edgedb] 
[edgedb]     /root/.local/share/edgedb/portable/5.4/bin/edgedb-server.py, line 7, in <module>
[edgedb]         > sys.exit(main())
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/click/core.py, line 1157, in __call__
[edgedb]         > return self.main(*args, **kwargs)
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/click/core.py, line 1078, in main
[edgedb]         > rv = self.invoke(ctx)
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/click/core.py, line 1666, in invoke
[edgedb]         > rv = super().invoke(ctx)
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/click/core.py, line 1434, in invoke
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/click/core.py, line 783, in invoke
[edgedb]         > return ctx.invoke(self.callback, **ctx.params)
[edgedb]         > return __callback(*args, **kwargs)
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/click/decorators.py, line 33, in new_func
[edgedb]         > return f(get_current_context(), *args, **kwargs)
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/edb/server/main.py, line 778, in main
[edgedb]         > server_main(**kwargs)
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/edb/server/main.py, line 756, in server_main
[edgedb]         > asyncio.run(run_server(
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/asyncio/runners.py, line 194, in run
[edgedb]         > return runner.run(main)
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/asyncio/runners.py, line 118, in run
[edgedb]         > return self._loop.run_until_complete(task)
[edgedb]     uvloop/loop.pyx, line 1517, in uvloop.loop.Loop.run_until_complete
[edgedb]         
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/edb/server/main.py, line 576, in run_server
[edgedb]         > pg_cluster_init_by_us = await cluster.ensure_initialized()
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/edb/server/pgcluster.py, line 508, in ensure_initialized
[edgedb]         > await self.init(
[edgedb]         > await _run_logged_subprocess(
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/edb/server/pgcluster.py, line 1388, in _run_logged_subprocess
[edgedb] 
[edgedb] edb.server.pgcluster.ClusterError: /root/.local/share/edgedb/portable/5.4/bin/pg_ctl exited with status 1:
[edgedb]     own the server process.
[edgedb]     Please log in (using, e.g., "su") as the (unprivileged) user that will
[edgedb]         > raise ClusterError(
[edgedb]     pg_ctl: cannot be run as root
[edgedb]     /root/.local/share/edgedb/portable/5.4/lib/python3.12/site-packages/edb/server/pgcluster.py, line 539, in init

解决方案

方法1:容器内切换非特权用户执行命令

  1. 进入容器后创建非特权用户:
adduser --disabled-password --gecos "" edgedb-user
  1. 切换到该用户:
su - edgedb-user
  1. 重新执行初始化命令:
edgedb project init --server-instance project --non-interactive

方法2:修改Docker Compose配置指定运行用户

在docker-compose.yml的EdgeDB服务中添加user字段,指定非特权用户的UID/GID或用户名:

services:
  edgedb:
    image: edgedb/edgedb:5.4
    user: "1000:1000" # 可替换为宿主机普通用户的UID/GID,或自定义用户名
    volumes:
      - ./dbschema:/project/dbschema
      - ./edgedb.toml:/project/edgedb.toml
    command: ["project", "init", "--server-instance", "project", "--non-interactive"]

保存配置后重启容器即可。

方法3:使用官方Docker部署方式

直接用官方镜像启动服务,挂载配置和schema目录完成初始化,无需手动执行project init:

services:
  edgedb:
    image: edgedb/edgedb:5.4
    environment:
      EDGEDB_SERVER_PASSWORD: your-password
    volumes:
      - edgedb-data:/var/lib/edgedb
      - ./dbschema:/dbschema
    ports:
      - "5656:5656"
    command: ["server", "--bootstrap-admin-password", "$EDGEDB_SERVER_PASSWORD", "--schema-dir", "/dbschema"]
volumes:
  edgedb-data:

内容的提问来源于stack exchange,提问作者Alberto Sanmartin Martinez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:56:05