运行 `mkdir` 在 Docker 容器内时权限被拒绝
Permission denied when running `mkdir` inside of a Docker container
我正在使用 Docker Compose 到 运行 几个容器,包括一个带有 Postgres 图像的容器。我正在尝试向该容器添加一个卷以跨容器构建保留我的数据。但是,当它尝试在容器中为该卷创建目录时,我收到错误消息。
我运行:
docker-compose build
然后
docker-compose up
我收到以下错误:
错误:对于cxbenchmark_db_1无法启动服务db:oci 运行时间错误:container_linux.go:265:启动容器进程导致"process_linux.go:368: container init caused \"rootfs_linux.go: 57: 将 \\"/var/lib/docker/volumes/69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e/_data\\" 安装到 rootfs \\"/var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged\\" 在 \\"/var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data\\" 导致 \\ "mkdir /var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data: permission denied\"\""
我的完整 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
文件中的显式卷绑定挂载有关,而是与主 postgres
official Docker image Dockerfile
中的 VOLUME
声明有关:
VOLUME /var/lib/postgresql/data
由于您没有为此目录(而是父目录)提供挂载点,docker 引擎正在创建一个本地卷,然后尝试将该卷挂载到您已经绑定挂载的目录中位置并获取权限错误。
为清楚起见,这里是 docker 引擎为您创建的音量:
/var/lib/docker/volumes/69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e/_data
这是它试图绑定挂载该目录的目录位置;在 /private/var/lib/postgresql
的绑定安装之上:
mkdir /var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data: permission denied
现在,我认为失败的原因是您可能在 Docker 引擎(“userns-remap
” flag/setting)中打开了用户命名空间,这样容器就不会' 有权在您的主机上该根目录拥有的位置创建一个目录。除此之外,唯一的其他选择是 postgres
容器以非 root 用户身份启动,但我在您的撰写文件或使用的最新版本的官方 Dockerfile
中看不到任何内容USER
指令。
顺便说一句,因为你的绑定安装与 postgres Dockerfile
中的 VOLUME
说明符不匹配,所以你最终会得到双卷,你可以更改你的撰写文件以安装到 /var/lib/postgresql/data
并绕过正在创建的额外卷。特别是如果您希望您的数据库数据最终位于 /private/var/lib/postgresql
,因为发现它不在那里,而是位于 /var/lib/docker/volumes/..
位置可能会令人惊讶。
我正在使用 Docker Compose 到 运行 几个容器,包括一个带有 Postgres 图像的容器。我正在尝试向该容器添加一个卷以跨容器构建保留我的数据。但是,当它尝试在容器中为该卷创建目录时,我收到错误消息。
我运行:
docker-compose build
然后
docker-compose up
我收到以下错误:
错误:对于cxbenchmark_db_1无法启动服务db:oci 运行时间错误:container_linux.go:265:启动容器进程导致"process_linux.go:368: container init caused \"rootfs_linux.go: 57: 将 \\"/var/lib/docker/volumes/69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e/_data\\" 安装到 rootfs \\"/var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged\\" 在 \\"/var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data\\" 导致 \\ "mkdir /var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data: permission denied\"\""
我的完整 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
文件中的显式卷绑定挂载有关,而是与主 postgres
official Docker image Dockerfile
中的 VOLUME
声明有关:
VOLUME /var/lib/postgresql/data
由于您没有为此目录(而是父目录)提供挂载点,docker 引擎正在创建一个本地卷,然后尝试将该卷挂载到您已经绑定挂载的目录中位置并获取权限错误。
为清楚起见,这里是 docker 引擎为您创建的音量:
/var/lib/docker/volumes/69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e/_data
这是它试图绑定挂载该目录的目录位置;在 /private/var/lib/postgresql
的绑定安装之上:
mkdir /var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data: permission denied
现在,我认为失败的原因是您可能在 Docker 引擎(“userns-remap
” flag/setting)中打开了用户命名空间,这样容器就不会' 有权在您的主机上该根目录拥有的位置创建一个目录。除此之外,唯一的其他选择是 postgres
容器以非 root 用户身份启动,但我在您的撰写文件或使用的最新版本的官方 Dockerfile
中看不到任何内容USER
指令。
顺便说一句,因为你的绑定安装与 postgres Dockerfile
中的 VOLUME
说明符不匹配,所以你最终会得到双卷,你可以更改你的撰写文件以安装到 /var/lib/postgresql/data
并绕过正在创建的额外卷。特别是如果您希望您的数据库数据最终位于 /private/var/lib/postgresql
,因为发现它不在那里,而是位于 /var/lib/docker/volumes/..
位置可能会令人惊讶。