问题
今天在 Docker Postgresql 用户名和密码授权的问题上花了一些时间,问题是:
psql: FATAL: password authentication failed for user "postgres"
admin 的用户名和密码是可以在 docker-compose.yml 里设置的,通常我们可以配置为:
postgresql:
image: postgres:latest
ports:
- "5434:5432"
volumes:
- ./data/pgsql:/var/lib/postgresql/data
- ./initialize/pgsql:/docker-entrypoint-initdb.d
environment:
POSTGRES_USER: postgres
POSTGRES_DB: postgres
secrets:
- pg_superuser_password
某个用户的密码可以在./initialize/pgsql
目录的脚本里设置:
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "postgres" <<-EOSQL
CREATE USER user WITH PASSWORD 'the-password';
ALTER USER user CREATEDB;
EOSQL
只是今天碰巧想修改一下这个密码,所以就把这个脚本里的密码修改了,然后执行命令:
docker-compose up --build -d --force-recreate
而后就一直出现上面的用户授权失败。
原因
刚开始一直认为是可能 dockerfile 配置得不对,结果花费了些时间。后来突然想到了,PG 里数据初始化应该只是第一次做了,后续如果发现/var/lib/postgresql/data
里已经有数据了就再也不会重新设置密码,这里是配置 volume 的,如果还未有重要数据把./data/pgsql
删除了即可,或者应该是可以通过 attach 进入容器通过 pg 命令修改。
总结
最近在自己工作的项目都完全 Docker 化,感觉是配置来折腾用起来飞。最近也在做一个重度依赖 Docker 的项目,所以 Docker 的文档需要看完,特别是网络和数据存储那块,否则会花费不少时间折腾。