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:容器内切换非特权用户执行命令
- 进入容器后创建非特权用户:
adduser --disabled-password --gecos "" edgedb-user
- 切换到该用户:
su - edgedb-user
- 重新执行初始化命令:
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
相关产品推荐
相关产品推荐

