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

zhi*_*sch 4 postgresql docker docker-compose docker-volume

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

我跑:

docker-compose build

然后

docker-compose up

我收到以下错误:

错误:对于 cxbenchmark_db_1 无法启动服务 db:oci 运行时错误:container_linux.go:265:启动容器进程导致“process_linux.go:368:容器初始化导致 \”rootfs_linux.go:57:挂载 \\”/var/lib/泊坞窗/卷/ 69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e / _data \\ “来根文件系统\\ ”的/ var / lib中/泊坞窗/ overlay2 / 627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355 /合并\\“ 在\\” 的/ var / lib中/泊坞窗/ overlay2 / 627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355 /合并的/ var / lib中/postgresql/data\\" 导致 \\"mkdir /var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/sql/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
Run Code Online (Sandbox Code Playgroud)

有关如何解决的任何想法?

Phi*_*l E 7

您看到的错误不是compose文件中显式卷绑定安装的问题(必然),而是VOLUME主要postgres官方 Docker 映像中Dockerfile的声明:

VOLUME /var/lib/postgresql/data

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

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

/var/lib/docker/volumes/69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e/_data
Run Code Online (Sandbox Code Playgroud)

这是它试图绑定挂载该目录的目录位置;在您的绑定安装之上/private/var/lib/postgresql

mkdir /var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data: permission denied
Run Code Online (Sandbox Code Playgroud)

现在,我认为失败的原因是您可能在 Docker 引擎中打开了用户命名空间(“ userns-remap” 标志/设置),因此容器无权在您的根目录拥有的位置创建目录主持人。除此之外,唯一的其他选择是postgres容器以非 root 用户身份启动,但我在您的撰写文件或Dockerfile使用USER指令。

VOLUME顺便说一句Dockerfile,由于您的绑定挂载与 postgres中的说明符不匹配,因此您最终会得到双卷,您可以更改您的撰写文件以挂载/var/lib/postgresql/data并绕过正在创建的额外卷。特别是如果你希望你的DB数据在结束了/private/var/lib/postgresql,因为它可能会惊奇地发现它不存在,而是在/var/lib/docker/volumes/..的位置。