postgresql - Docker 容器中 PostgreSQL 的权限问题

标签 postgresql docker ubuntu docker-compose file-permissions

我正在尝试使用 PostgreSQL 运行一个 docker 镜像,该镜像的卷配置为持久化数据。

docker-compose.yml

version: '3.1'

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

当我启动容器时,我看到了输出

fixing permissions on existing directory /var/lib/postgresql/data ... ok

我无法再读取数据文件夹。

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

drwx------ 19 systemd-coredump root 4096 May 17 16:22 data

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

为什么会发生这种情况,我该如何解决?

最佳答案

另一个答案确实指出了问题的根本原因,但是它指向的帮助页面不包含解决方案。这是我想出的让这个对我有用的东西:

  1. 使用普通的 docker-compose 文件启动容器,这将创建具有硬编码 uid:gid (999:999) 的目录
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
$ docker stop postgres
$ sudo chown -R 1000:1000 ./data 
  1. 编辑您的 docker 文件以添加所需的 uid:gid 并使用 docker-compose 再次启动它(注意 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

您不能从一开始就使用 user: 的原因是,如果图像以不同的用户身份运行,则无法创建数据文件。

关于 image documentation page ,它确实提到了一个解决方案,即在提供 --user 选项时添加一个卷以将 /etc/passwd 文件公开为只读文件,但是,确实如此不适用于最新图像,因为我收到以下错误。事实上,我提出的三个解决方案都不适合我。

initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted

关于postgresql - Docker 容器中 PostgreSQL 的权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56188573/

相关文章:

php - 为某些网站切换 nginx php 版本

javascript - 如何使用 Jest/Supertest/Knex/Postgres 处理外键约束

c# - 如何保证条目的时间范围不重叠?

Python-使用来自 psycopg2 的二进制复制表

java - TumblingWindow 中的 Flink AggregateFunction 自动分割为两个窗口以实现大窗口大小

ruby-on-rails - 找不到您的/home/rails/webapp/Gemfile.lock 所需的 'bundler' (2.1.4)。 (Gem::GemNotFoundException) 运行 docker build

git推送到远程: commits are going through but can't see files?

python - 使用 pip 在 ubuntu 上安装 prettytable 时出错

sql - Postgres - 将两列聚合成一个项目

windows - 手动删除 Hyper-V 中的 MobyLinuxVM 后,Windows 10 上的 Docker 无法启动