Dan*_*iel 13 postgresql ubuntu file-permissions docker docker-compose
我正在尝试使用 PostgreSQL 运行一个 docker 镜像,该镜像有一个配置用于持久化数据的卷。
version: '3.1'
services:
db:
image: postgres
restart: always
volumes:
- ./data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: example
Run Code Online (Sandbox Code Playgroud)
当我启动容器时,我看到输出
修复现有目录 /var/lib/postgresql/data 的权限...好的
并且数据文件夹对我来说不再可读。
如果我提升自己并访问数据目录,我可以看到文件在那里。此外,该命令ls -ld data
给了我
drwx------ 19 systemd-coredump root 4096 May 17 16:22 data
Run Code Online (Sandbox Code Playgroud)
我可以使用 手动设置目录权限sudo chmod 755 data
,但这仅在我重新启动容器之前有效。
为什么会发生这种情况,我该如何解决?
这是因为postgres 镜像的dockerfile中写入的内容。
从第 15 行到第 18 行,您将看到使用了组 999 和用户 999。我猜在你的主机中,它们分别映射到systemd-coredump
和root
。
您需要知道,每当您在映像中使用用户/组时,如果您的主机中存在 uid/gid,那么它将映射到它。
您可以在此处从 postgres 映像阅读有关 docker hub 的文档。有一个“Arbitrary --user Notes”部分解释了它在此图像的上下文中如何工作。
另一个答案确实指出了问题的根本原因,但是它指向的帮助页面不包含解决方案。这是我想出的办法来为我工作:
version: '3.7'
services:
db:
image: postgres
container_name: postgres
volumes:
- ./data:/var/lib/postgresql/data
environment:
POSTGRES_USER: fake_database_user
POSTGRES_PASSWORD: fake_database_PASSWORD
Run Code Online (Sandbox Code Playgroud)
$ docker stop postgres
$ sudo chown -R 1000:1000 ./data
Run Code Online (Sandbox Code Playgroud)
user:
)version: '3.7'
services:
db:
image: postgres
container_name: postgres
volumes:
- ./data:/var/lib/postgresql/data
user: 1000:1000
environment:
POSTGRES_USER: fake_database_user
POSTGRES_PASSWORD: fake_database_password
Run Code Online (Sandbox Code Playgroud)
您不能user:
从一开始就使用的原因是,如果图像以不同的用户身份运行,则无法创建数据文件。
在图像文档页面上,它确实提到了/etc/passwd
在提供--user
选项时添加卷以在图像中将文件公开为只读的解决方案,但是,这对我使用最新图像不起作用,因为我收到以下错误. 事实上,这三个提议的解决方案都不适合我。
initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9016 次 |
最近记录: |