.pgpass用于Dockerized环境中的PostgreSQL复制

时间:2014-10-15 17:03:41

标签: postgresql docker coreos

我尝试使用Docker和bash脚本(我使用Coreos)设置PostgreSQL从站。我没有找到任何方法来提供有效的.pgpass

我知道我可以创建一个PGPASSWORD环境变量,但出于安全原因不希望这样做(如http://www.postgresql.org/docs/current/static/libpq-envars.html所述),并且因为每次recovery.conf文件都应该可以访问此密码用于(对于primary_conninfo变量)。

Dockerfile

# ...
# apt-get installs and other config
# ...

USER postgres
# Create role and db
RUN /etc/init.d/postgresql start &&\
    psql --command "CREATE USER replicator WITH ENCRYPTED PASSWORD 'THEPASSWORD';" &&\
    psql --command "CREATE DATABASE db WITH OWNER replicator;"

# Set the pg_pass to allow connection to master
ADD ./pgpass.conf /home/postgres/.pgpass # pgpass.conf comes my root git folder
USER root
RUN chmod 0600 /home/postgres/.pgpass

在我的bash文件中

# ...

pg_basebackup -h host.of.master.ip -D /var/pgbackup/backup_data -U replicator -v -P

# ...

问题似乎是没有读取pgpass文件。我似乎应该使用我对(https://serverfault.com/questions/526170/psql-fe-sendauth-no-password-supplied)sudoing的用户的密码,但在这种情况下,复制器角色自然不是可用的bash用户。 (请注意,不能将pgpass复制到/ home / root而不是/ home / postgres。)

注意:我的pgpass文件和远程数据库conf

# pgpass.conf
host.of.master.ip:5432:replication:replicator:THEPASSWORD
host.of.master.ip:5432:*:replicator:THEPASSWORD

# pg_hba.conf
host    replication   replicator    host.of.slave.ip/24    md5

1 个答案:

答案 0 :(得分:4)

您必须在将要运行命令的用户的主文件夹上创建.pgpass(在本例中为postgres)。该文件的每一行必须位于format hostname:port:database:username:password并支持通配符,因此您只需将数据库设置为“*”即可。

就我而言,我有类似的东西......

$ sudo echo "${PRIMARY_IP}:5432:*:${REPL_USER}:${REPL_PASS}" > /var/lib/postgresql/.pgpass
$ sudo chown postgres:postgres /var/lib/postgresql/.pgpass
$ sudo chmod 0600 /var/lib/postgresql/.pgpass
$ sudo -u postgres pg_basebackup -h $PRIMARY_IP -D /var/lib/postgresql/9.4/main -U ${REPL_USER} -v -P --xlog-method=stream

当我使用-e PRIMARY_IP=x.x.x.x

运行docker容器时,会设置这些变量(例如PRIMARY_IP)