首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >码头集装箱中PostgreSQL的权限问题

码头集装箱中PostgreSQL的权限问题
EN

Stack Overflow用户
提问于 2019-05-17 14:32:59
回答 3查看 23.3K关注 0票数 24

我正在尝试使用PostgreSQL运行一个码头映像,该映像配置了一个卷,用于持久化数据。

docker-compose.yml

代码语言:javascript
复制
version: '3.1'

services:
  db:
    image: postgres
    restart: always
    volumes:
      - ./data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: example

启动容器时,会看到输出

修改现有目录/var/lib/postgresql/data的权限.好的

数据文件夹对我来说不再是可读的了。

如果我提升自己并访问数据目录,我可以看到文件就在那里。此外,ls -ld data命令给出了

代码语言:javascript
复制
drwx------ 19 systemd-coredump root 4096 May 17 16:22 data

我可以使用sudo chmod 755 data手动设置目录权限,但只能在重新启动容器之前才能使用。

为什么会发生这种事,我该怎么解决呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-06 04:44:35

另一个答案确实指出了问题的根源,但是它所指向的帮助页并不包含解决方案。下面是我想出的办法,让这件事为我服务:

  1. 使用普通的docker-组合文件启动容器,这将使用硬编码的uid:gid (999:999)创建目录。
代码语言:javascript
复制
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
  1. 停止容器并手动将所有权更改为uid:gid (本例中将使用1000:1000 )
代码语言:javascript
复制
$ docker stop postgres
$ sudo chown -R 1000:1000 ./data 
  1. 编辑您的码头文件,以添加您想要的uid:gid,并再次启动它使用docker -组合(注意user:)
代码语言:javascript
复制
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

您不能从一开始就使用user:的原因是,如果映像作为不同的用户运行,它就无法创建数据文件。

图像文档页上,它确实提到了添加一个卷的解决方案,以便在提供--user选项时将/etc/passwd文件公开为只读文件,但是,对于最新的映像,这并不适用,因为我得到了以下错误。事实上,所提出的三种解决办法中没有一种对我有用。

代码语言:javascript
复制
initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted
票数 16
EN

Stack Overflow用户

发布于 2019-05-17 14:53:54

这是因为在postgres图像的码头文件中所写的内容。

从第15行到第18行,您将看到组999和用户999被使用。我猜在您的主机中,它们分别映射到systemd-coredumproot

您需要知道,每当您在映像中使用用户/组时,如果您的主机中存在uid/gid,那么它将被映射到它。

您可以从postgres映像这里读取停靠中心的文档。有一节任意--用户注释解释了它在这个图像的上下文中是如何工作的。

票数 6
EN

Stack Overflow用户

发布于 2022-05-12 08:20:58

一个更容易和持久的解决办法如下:

将这些行添加到~/.bashrc

代码语言:javascript
复制
export UID=$(id -u)
export GID=$(id -g)

重新加载外壳:

代码语言:javascript
复制
$ source ~/.bashrc

修改您的docker-compose.yml如下:

代码语言:javascript
复制
version: "3.7"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    user: "${UID}:${GID}"
    ...

来源

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56188573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档