我试图在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的信息,但我没有找到任何东西。
谢谢!
答案 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