在尝试使用卷时,Postgresql引发“数据目录具有错误的所有权”

时间:2014-07-04 07:57:56

标签: postgresql docker

我试图在docker容器中运行postgresql,但当然我需要让我的数据库数据持久化,所以我试图使用仅数据容器来暴露卷来存储数据库的地方。

所以,我的数据容器有这样的Dockerfile:

FROM ubuntu

# Create data directory
RUN mkdir -p /data/postgresql

# Create /data volume
VOLUME /data/postgresql

我跑了:

docker run --name postgresql_data lyapun/postgresql_data true

在我的postgresql.conf中,我设置了:

data_directory = '/data/postgresql'

然后我以这样的方式运行我的postgresql容器:

docker run -d --name postgre --volumes-from postgresql_data lyapun/postgresql

我得到了:

2014-07-04 07:45:57 GMT FATAL:  data directory "/data/postgresql" has wrong ownership
2014-07-04 07:45:57 GMT HINT:  The server must be started by the user that owns the data directory.

如何处理这个问题?我搜索了很多关于使用带有docker卷的postgresql的信息,但我没有找到任何东西。

谢谢!

4 个答案:

答案 0 :(得分:3)

好的,好像我找到了解决这个问题的方法。

而不是以这种方式运行postgres:

CMD ["/usr/lib/postgresql/9.1/bin/postgres", "-D", "/var/lib/postgresql/9.1/main", "-c", "config_file=/etc/postgresql/9.1/main/postgresql.conf"]

我写过bash脚本:

chown -Rf postgres:postgres /data/postgresql
chmod -R 700 /data/postgresql
sudo -u postgres /usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main -c config_file=/etc/postgresql/9.1/main/postgresql.conf

将postgresql图像中的CMD替换为:

CMD ["bash", "/run.sh"]

有效!

答案 1 :(得分:1)

您必须将目录/ data / postgresql的所有权设置为运行postgresql二进制文件的同一用户。例如,在Ubuntu中,它通常是postgres用户。

然后你必须使用这个命令:

chown postgres.postgres /data/postgresql

答案 2 :(得分:0)

解决该问题的更好方法,假设您的postgres图像名为“postgres”,并且您的备份是./backup.tar:

首先,将其添加到postgres Dockerfile:

VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

然后运行:

docker run -it --name postgres -v $(pwd):/db postgres sh -c "tar xvf /db/backup.tar --no-overwrite-dir" && \
docker run -it --name data --volumes-from postgres busybox true && \
docker rm postgres && \
docker run -it --name postgres --volumes-from=data postgres

由于您的postgres图像的postgres用户提取了存档,因此您没有权限问题,因此它是提取文件的所有者。 然后,您可以使用数据容器备份数据。此解决方案的优点是每次运行映像时都不会chmod / chown。

答案 3 :(得分:0)

将NTFS目录链接到Docker容器时,这种类型的错误非常常见。 NTFS目录不支持ext3文件和目录访问控制。 使其起作用的唯一方法是将目录从ext3驱动器链接到您的容器中。

当我在链接Apache文件夹的Apache / PHP容器中玩耍时感到有些绝望。当我链接的文件驻留在ext3文件系统上后,问题消失了。

我在youtube上发布了一个简短的Docker教程,可能有助于理解此问题:https://www.youtube.com/watch?v=eS9O05TTFjM