Nix-Shell环境下配置PostgreSQL启动正常但创建用户报错求助
问题根因
你的PostgreSQL服务启动时按配置将Unix套接字文件生成在/tmp目录下,但Nix源中打包的PostgreSQL客户端默认会从/run/postgresql路径查找套接字,二者路径不匹配导致客户端无法连接到运行中的服务。
解决方案
方案1:临时指定套接字路径(单次命令生效)
执行所有PostgreSQL客户端命令时,手动加-h /tmp参数指定套接字目录,比如创建用户的命令改为:
createuser -h /tmp postgres --createdb --echo
Phoenix项目的Ecto配置也可以对应修改,在config.exs的数据库配置项中添加hostname: "/tmp"即可。
方案2:全局配置环境变量(nix-shell内永久生效)
直接在shell.nix的mkShell块中添加PGHOST环境变量,所有PostgreSQL客户端会自动读取该变量作为套接字查找路径,无需修改其他配置:
mkShell { # 原有配置不变 PGDATA="./.db/postgres"; RDDATA="./.db/redis"; PGHOST = "/tmp"; # 新增这一行 # 原有配置不变 }
修改后重新进入nix-shell即可生效。
方案3:修改服务端套接字路径
如果希望统一使用/run/postgresql作为套接字路径,可将postgresql.conf中的unix_socket_directories配置改为'/run/postgresql',需要确保当前用户对/run/postgresql目录有读写权限。该方案需要调整系统目录权限,个人开发环境更推荐前两种方案。
额外修正
你当前的shell.nix存在两处语法错误,会导致nix-shell启动失败:
buildInputs列表末尾多了一个多余的右括号)shellHook的字符串包裹符''没有闭合,需要在ERL_INCLUDE_PATH配置行后补全''
修正后的shellHook示例:
shellHook = '' ERL_INCLUDE_PATH="${erlangR22}/lib/erlang/usr/include"; '';
内容的提问来源于stack exchange,提问作者Abdul Mughees
相关产品推荐
相关产品推荐

