postgresql - 在 Docker 容器内运行 `mkdir` 时权限被拒绝

标签 postgresql docker docker-compose docker-volume

我正在使用 Docker Compose 运行多个容器,包括一个带有 Postgres 镜像的容器。我正在尝试向该容器添加一个卷以跨容器构建保留我的数据。但是,当它尝试在容器中为该卷创建目录时,我收到错误消息。

我跑:

docker-compose 构建

然后

docker-compose up

我收到以下错误:

错误:对于 cxbenchmark_db_1 无法启动服务 db:oci 运行时错误:container_linux.go:265:启动容器进程导致“process_linux.go:368:容器初始化导致\”rootfs_linux.go:57:安装\\”/var/lib/docker/volumes/69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e/_data\\"to rootfs\\"/var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged\\"at\\"/var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data\\"导致\\"mkdir/var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data: 权限被拒绝\\"\""

我的完整 docker-compose.yml 看起来像这样(请注意名为 db 的服务,其中定义了卷):

version: '3'  

services:  
  nginx:
    image: nginx:latest
    ports:
      - 80:8000
    volumes:
      - ./src:/src
      - ./config/nginx:/etc/nginx/conf.d
      - ./src/static:/static
    depends_on:
      - web

  web:
    build: .
    command: bash -c "python manage.py makemigrations && python manage.py migrate && gunicorn cx_benchmark.wsgi -b 0.0.0.0:8000"
    depends_on:
      - db
    volumes:
      - ./src:/src
      - ./src/static:/static
    expose:
      - 8000

  db:
    image: postgres:latest
    volumes:
      - /private/var/lib/postgresql:/var/lib/postgresql
    ports:
      - 5432:5432

有什么解决办法吗?

最佳答案

您看到的错误不是(必然)您的compose 文件中显式卷绑定(bind)挂载的问题,而是主 postgres official Docker image Dockerfile 中的VOLUME 声明的问题:

VOLUME/var/lib/postgresql/data

由于您没有为此目录(而是父目录)提供挂载点,docker 引擎正在创建一个本地卷,然后尝试将该卷挂载到您已经绑定(bind)挂载的位置并出现权限错误.

为清楚起见,这里是 docker 引擎为您创建的卷:

/var/lib/docker/volumes/69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e/_data

这是它试图绑定(bind)挂载目录的目录位置;在 /private/var/lib/postgresql 的绑定(bind)挂载之上:

mkdir /var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data: permission denied

现在,我认为失败的原因是您可能在 Docker 引擎中打开了用户 namespace (“userns-remap”标志/设置),这样容器就没有在您的主机上该 root 拥有的位置创建目录的权限。除此之外,唯一的其他选择是 postgres 容器以非 root 用户身份启动,但我在您的撰写文件或官方 Dockerfile 中看不到任何内容对于使用 USER 指令的最新版本。

顺便说一句,因为你的绑定(bind)安装与 postgres Dockerfile 中的 VOLUME 说明符不匹配,所以你最终得到了双卷,你可以改变你的编写文件以挂载到 /var/lib/postgresql/data 并绕过正在创建的额外卷。特别是如果您希望您的数据库数据最终位于 /private/var/lib/postgresql 中,因为发现它不存在,而是位于 /var/中可能会令人惊讶lib/docker/volumes/.. 位置。

关于postgresql - 在 Docker 容器内运行 `mkdir` 时权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47214644/

相关文章:

sql - 为什么以及如何 SQL 条件不在 psql 解释计划中?

java - 如何在postgreSQL数据库中存储ISO/IEC 19794-2指纹模板

docker - 在docker和master到tserver双向连接/循环链接问题中运行Kudu-docker composition

Docker 基础知识,如何保存已安装的包和编辑过的文件?

docker - 使用 Docker Compose 运行时的端口发布

sql - 仅考虑具有特定条目的项目来聚合表的有效方法

postgresql - 我已经创建了一个 PostgreSQL 表,但如果使用 WHERE 参数,则无法 SELECT

docker - 清理一半下载的Docker镜像

django - 在 Docker 容器中与 Django 和 Postgres 之间的连接苦苦挣扎

azure - `docker-compose up` 与 `docker compose up` 与环境变量