Docker镜像中psql连PostgreSQL如何自动传密码?有无替代.pgpass方案?
psql自动传密码的解决方案
报错原因
psql的--password/-W参数仅用于强制触发密码输入提示,本身不接收密码值作为参数,所以你之前的写法会触发参数不合法报错。
推荐方案(最便捷,适配Docker Secret)
用PostgreSQL原生支持的PGPASSWORD临时环境变量传递密码,不需要生成.pgpass文件,语法如下:
# 直接读取Docker Secret的值传递给psql,替换为你实际的secret文件名即可 PGPASSWORD=$(cat /run/secrets/你的secret名称) psql analytics \ --host=${INPUT_HOST} \ --username=analytics \ --port=32648
- 该写法中
PGPASSWORD仅对当前这一条psql命令生效,不会残留在系统环境变量中 - 密码不会出现在进程参数列表中,不会被
ps等命令查看到,符合安全要求 - 不需要处理pgpass文件的权限、变量替换等额外逻辑,比你当前的方案简单很多
可选方案:动态生成.pgpass文件
如果场景要求必须用pgpass文件,可以在容器启动时动态生成,不需要提前写入镜像,注意必须设置0600权限否则psql会忽略该文件:
echo "${INPUT_HOST}:32648:analytics:analytics:${INPUT_PASSWORD}" > ~/.pgpass chmod 0600 ~/.pgpass psql analytics --host=${INPUT_HOST} --username=analytics --port=32648
注意要将端口替换为你实际使用的32648,不要用模板默认的5432,否则pgpass不会生效
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

