Jenkins从节点构建Rails执行db:migrate报PG用户1001不存在怎么解决
问题产生原因
该错误由用户ID映射不匹配 + PostgreSQL默认认证规则共同导致:
- Jenkins从节点上的任务默认使用宿主机jenkins用户(UID通常为1001)的身份执行,你配置的docker agent会默认将该UID映射到容器内部运行命令
- 你使用的官方
ruby:2.6.6镜像中不存在UID为1001的本地用户 - 从节点上部署的PostgreSQL默认开启
peer认证模式,本地连接时会校验发起请求的操作系统用户是否存在、是否与数据库用户同名,容器内发起请求的UID 1001没有对应的本地用户,因此认证被拒绝
可尝试的解决思路
- 修改PostgreSQL认证规则:编辑从节点上PostgreSQL的
pg_hba.conf配置文件,将本地连接的认证规则从peer改为md5,修改完成后重启PostgreSQL服务,同时在Rails项目的database.yml中配置对应数据库账号的用户名和密码,走密码认证跳过本地用户校验 - 指定Docker容器运行用户:在pipeline的docker配置段添加
args '--user root'参数,强制容器内使用root身份执行命令,root用户在宿主机和容器内均存在,可通过peer认证 - 改用TCP方式连接数据库:在Rails项目的
database.yml测试环境配置中添加host: 127.0.0.1、port: 5432参数,同时配置明确的数据库用户名和密码,走TCP连接的密码认证,不会触发本地用户校验 - 自定义Ruby基础镜像:基于官方
ruby:2.6.6镜像构建自定义镜像,提前在镜像内执行useradd -u 1001 jenkins创建对应UID的用户,后续pipeline使用自定义镜像作为运行环境,即可匹配UID映射规则
内容的提问来源于stack exchange,提问作者josegp
相关产品推荐
相关产品推荐

