根本原因可能是pg15修改了默认验证规则。
配置文件路径:/etc/postgresql/15/main/pg_hba.conf
文件内容如下:
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::/0 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
备份执行的命令如下:
pg_dump --schema=public -T public.pg_* --file=‘/src/tmp/backups/default/2026-02-02-063003/dump.sql.gz’ --no-owner --no-privileges --verbose --compress=4 --username=postgres discourse_development
因为local all postgres peer这个规则导致上面的命令报错:Peer authentication failed for user "postgres"
解决思路:将peer改成trust,放行本地环境的所有命令。即所有命令不需要再验证(也不需要输入密码)。
具体步骤:
复制容器中的/etc/postgresql/15/main/pg_hba.conf到本地
sudo docker cp discourse_dev:/etc/postgresql/15/main/pg_hba.conf ~/discourse/data/pg_hba.conf
给权限644
sudo chmod 644 ~/discourse/data/pg_hba.conf
修改data/pg_hba.conf的配置
# Database administrative login by Unix domain socket
local all postgres trust
修改d/boot_dev文件,挂载data/pg_hba.conf到容器中,覆盖pg默认的配置文件。
docker run -d \
-p $local_publish:8025:8025 \
-p $local_publish:3000:3000 \
-p $local_publish:4200:4200 \
-p $local_publish:9292:9292 \
-p $local_publish:9405:9405 \
-v "$DATA_DIR:/shared/postgres_data:delegated" \
# 下面这行是新增的,挂载配置文件到容器中,且只给容器只读权限
-v "$SOURCE_DIR/data/pg_hba.conf:/etc/postgresql/15/main/pg_hba.conf:ro" \
-v "$SOURCE_DIR:/src:delegated" \
-e UNICORN_BIND_ALL=true \
$mount_plugin_symlinks \
$ENV_ARGS \
--hostname=discourse \
--name=discourse_dev \
--restart=always \
discourse/discourse_dev:release /sbin/boot
关闭并删除当前容器,然后重建新容器
d/shotdown_dev
d/boot_dev
重建后,启动前后端应用,测试备份是否正常
d/rails s
# 另一个命令行执行
d/ember-cli
在备份页面,点击备份,等待几秒钟后,查看备份文件列表。
1 个赞
基于上面的经验,现有能够实现用本地数据库客户端连接Docker中postgreSQL数据库的愿望了。
修改d/boot_dev文件中的配置如下:
docker run -d \
-p $local_publish:8025:8025 \
-p $local_publish:3000:3000 \
-p $local_publish:4200:4200 \
-p $local_publish:9292:9292 \
-p $local_publish:9405:9405 \
# 新增端口映射
-p $local_publish:55432:5432 \
-v "$DATA_DIR:/shared/postgres_data:delegated" \
# 保持配置文件映射
-v "$SOURCE_DIR/data/pg_hba.conf:/etc/postgresql/15/main/pg_hba.conf:ro" \
-v "$SOURCE_DIR:/src:delegated" \
-e UNICORN_BIND_ALL=true \
$mount_plugin_symlinks \
$ENV_ARGS \
--hostname=discourse \
--name=discourse_dev \
--restart=always \
discourse/discourse_dev:release /sbin/boot
放行所有连接pg的请求:
在data/pg_hba.conf文件中,修改配置如下:
# IPv4 local connections:
host all all 0.0.0.0/0 trust
# IPv6 local connections:
host all all ::/0 trust
重新构建
d/shutdown_dev
d/boot_dev
现在可以使用本地数据库客户端连接了
我这里使用的是DBeaver
数据库端口号55432,和d/boot_dev中保持一致,这里是55432,为了避免和本地已有的冲突。
数据库名
建议勾选“显示所有数据库”
用户名
测试一下是否能连接
点击确定保存
终于可以愉快地在本地查看数据库里面的数据了。
1 个赞
manu-p
(Manup)
2026 年5 月 7 日 16:45
323
你好,虽然在 Ubuntu 26.04 机器上按照本教程操作后一切看似正常,但似乎没有任何邮件发出。
我确实在一个专用终端中启动了 d/mailhog,并在那里看到了测试用户注册后发送的邮件的 HTML/CSS 代码,但该用户并未收到发送至我提供的邮箱地址的任何邮件……
我漏掉了什么?该如何解决?
邮件应该会出现在 http://localhost:8025 ,我相信这是 MailHog 的端口。
这不是生产环境安装,因此不会通过互联网发送电子邮件。若要实现这一点,您需要完整的生产环境安装以及兼容的邮件服务(如今这通常涉及真实费用,因为建立信任需要成本 )
1 个赞
manu-p
(Manup)
2026 年5 月 7 日 16:58
325
谢谢 @merefield ,我确实看到了 localhost:8025,但不知为何当时无法使用,现在一切正常了。
1 个赞
dubwoc
2026 年5 月 22 日 05:35
326
这个解决方案可行吗?我无法越过 d/boot_dev --init 这一步。
更新:
我明白了,如果你的开发者 UID 不是 1000(就像 discourse_dev 容器中的 discourse 用户那样),这个方法似乎就失效了。
uid=1000(discourse) gid=1000(discourse) groups=1000(discourse)
我遇到的一系列问题
nastee@station ~/vendsrc/discourse > ./d/boot_dev --init
正在使用位于:/home/nastee/vendsrc/discourse 的源码
正在使用位于:/home/nastee/vendsrc/discourse/data/postgres 的数据
release: 正在从 discourse/discourse_dev 拉取
.....
摘要:sha256:e118af085d4be0486d4d9bfa83ac1c519d9975bed9a08180d10d5ad7c508632c
状态:已下载 discourse/discourse_dev:release 的新镜像
docker.io/discourse/discourse_dev:release
f517752802e70b8a9110972bb3ddc0e9343d0c430603e4a9ae3eacc5ec69a2cf
正在安装 gems...
尝试写入 `/src/Gemfile.lock` 时出错。您可能需要为该路径授予写入权限。
感谢:There was an error while trying to write to `/src/Gemfile.lock`. It is likely that you need to grant write permissions for that path - #2 by jacque006
我将该文件权限设为 777(真恶心),这样做之后,至少 Gems 现在可以安装了,但下一个 docker exec 进程尝试写入源码目录时却失败了,因为它并非以我的用户身份运行,于是我得到了以下错误:
EACCES EACCES: 权限被拒绝,无法打开 '/src/_tmp_82_62be1aeb82e80c1d1054dac8bdbc5923'
好吧,那为什么不试试 sudo chmod 4777 . 呢,其中 . 是我正在运行 d/ 命令的克隆源码目录。
这导致我遇到了:
EACCES 尝试创建符号链接 "../../../node_modules/.pnpm/prettier@3.8.1/node_modules/prettier" 到 "/src/docs/developer-guides/node_modules/prettier" 时出错。错误发生在尝试创建符号链接目标父目录时。详细信息:Error: EACCES: 权限被拒绝,无法创建目录 '/src/docs/developer-guides/node_modules'
在遇到另一个权限问题并直接执行 chmod 777 -R . 之后:
最终导致:
连接到位于套接字 "/var/run/postgresql/.s.PGSQL.5432" 的服务器失败:没有此类文件或目录