我正在尝试使用PostgreSQL运行一个Docker映像,它有一个配置为持久化数据的卷。
停靠-编写.yml
version: '3.1'
services:
db:
image: postgres
restart: always
volumes:
- ./data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: example
当我启动容器时,我看到输出
正在修复现有目录/var/lib/postgresql/data的权限...确定
数据文件夹对我来说不再可读。
如果我提升自己并访问数据目录,我可以看到文件在那里。
drwx------ 19 systemd-coredump root 4096 May 17 16:22 data
我可以使用sudo chmod 755 data
手动设置目录权限,但只有在重新启动容器后才能使用。
为什么会发生这种情况,我该如何解决?
4条答案
按热度按时间b1uwtaje1#
另一个答案确实指出了问题的根本原因,但是它所指向的帮助页面并不包含解决方案。下面是我为解决这个问题而想到的方法:
1.使用普通的docker-compose文件启动容器,这将创建带有硬编码uid:gid(999:999)的目录
1.停止容器并手动将所有权更改为所需的uid:gid(在本例中,我将使用1000:1000
1.编辑您的docker文件,添加您想要的uid:gid,然后使用docer-compose再次启动它(注意
user:
)不能从一开始就使用
user:
的原因是,如果映像以不同的用户身份运行,它将无法创建数据文件。在image documentation page上,它确实提到了一个解决方案,即在提供
--user
选项时,添加一个卷以将/etc/passwd
文件在映像中显示为只读,然而,这对我使用最新的映像不起作用,因为我得到了以下错误。mum43rcc2#
这是因为在postgres映像的dockerfile中写入了什么。
从第15行到第18行,您将看到使用了组999和用户999,我猜在您的主机中,它们分别Map到
systemd-coredump
和root
。您需要知道,每当您在映像中使用用户/组时,如果uid/gid存在于您的主机中,那么它将被Map到该主机。
您可以从postgres映像here中阅读Docker hub的文档,其中有一节Arbitrary --user Notes解释了它在该映像的上下文中是如何工作的。
qjp7pelc3#
一个更容易和持久的解决办法如下:
将以下行添加到
~/.bashrc
:重新加载您的shell:
按如下所示修改
docker-compose.yml
:Source
0yycz8jy4#
我是这么做的:
postgres_setup容器仅更改权限,然后关闭