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

我正在使用Docker Compose来运行多个容器,包括一个Postgres图像。 我正在尝试将卷添加到该容器,以便在容器构build中保留我的数据。 但是,当我试图在容器中为这个卷创build一个目录时,我收到一个错误。

我运行:

docker-compose build

然后

docker-compose up

我收到以下错误:

错误:对于cxbenchmark_db_1无法启动服务db:oci运行时错误:container_linux.go:265:启动容器进程导致“process_linux.go:368:容器init导致”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 / 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官方Docker镜像DockerfileVOLUME声明:

VOLUME /var/lib/postgresql/data

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

为了清楚起见,以下是docker引擎为您创build的音量:

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

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

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

现在,我认为这是失败的原因是,你可能已经打开你的Docker引擎中的用户命名空间(“ userns-remap ”标志/设置),使容器没有权限创build一个根目录拥有在您的主机上的位置。 除此之外,唯一的select是postgres容器是以非root用户身份启动的,但是我没有在您的撰写文件或使用USER指令的最新版本的官方Dockerfile看到任何内容。

Dockerfile ,由于您的绑定挂载与postgres Dockerfile中的VOLUME说明符不匹配,因此您将以双卷结束,因此您可以将您的写入文件更改为挂载到/var/lib/postgresql/data并绕过额外的卷被创build。 特别是如果你期望你的数据库数据最终在/private/var/lib/postgresql ,因为它可能是令人惊讶的发现它不在那里,而是在/var/lib/docker/volumes/..位置。

基于https://github.com/docker/compose/issues/4039 ,常见的修复是:

  • 重新启动泊坞窗服务
  • 运行docker-compose作为sudo

我能够得到这个工作:

  • sudo mkdir /private/lib/postgresql

  • docker-compose up

使用以下docker-compose.yml:

 version: '3' services: nginx: image: nginx:latest ports: - 80:8000 db: image: postgres:latest volumes: - /private/var/lib/postgresql:/var/lib/postgresql ports: - 5432:5432 

对不起,我没有更多的帮助!