当前位置: 首页 > 知识库问答 >
问题:

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

祁嘉木
2023-03-14

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

我运行:

docker-compose build

然后

docker compose up

我收到以下错误:

错误:对于cxbenchmark\u db\u 1,无法启动服务db:oci运行时错误:container\u linux。go:265:启动容器进程导致“process\u linux。go:368:容器初始化导致”rootfs\u linux。go:57:mounting\\“/var/lib/docker/volumes/69845a017b4465e9122852a75ca194db473df95fa218658b60fb56eba9be9e/_data\\”to rootfs\\“/var/lib/docker/overlay2/627956d63fb0480448079577a83b54b53f8366fdf31136b7c66951c3f672355/merged\\”at\\“/var/lib/docker/overlay2/627956d63fb0480448079577a83b53b53f83b538b83383855 66FDF31136B7C669541C3F672355/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

有什么想法如何解决?

共有1个答案

东门俊民
2023-03-14

您看到的错误不是(必然)在您的compose文件中显式的卷绑定装载的问题,而是在主postgres中的声明

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”标志/设置),这样容器就没有权限在您的主机上根所有的位置创建目录。除此之外,唯一的另一个选项是,postgres容器以非root用户的身份启动,但我在您的撰写文件或官方的Dockerfile中没有看到使用user指令的最新版本的任何内容。

顺便说一句,由于您的绑定挂载与postgresDockerfile中的VOLUME说明符不匹配,因此您最终会使用双卷,因此您可以更改您的compose文件以挂载到/var/lib/postgresql/data并绕过正在创建的额外卷。尤其是如果您希望您的DB数据最终位于/Private/var/lib/postgresql中,因为发现它不在那里可能会令人惊讶,而是在/var/lib/docker/体积/...位置。

 类似资料:
  • 我添加了使用权限,包括WRITE_EXTERNAL_STORAGE,android.permission.相机,READ_EXTERNAL_STORAGEAndroidManifest.xml. 当我在Nexus6(API 24)中运行我的应用程序时,它向我抛出了以下错误: java.io.IOException:权限被拒绝 这是我的代码: 如何在权限相机运行时打开之前使用它?

  • 我已经搜索了几个小时了,但找不到解决方案,即使有类似的问题。 我试图在一个全新的laravel安装上运行php artisan tinker,用户是网站管理员(项目目录demo的所有者),但我遇到了以下错误: 使用详细标志运行: 异常跟踪:照亮\Foundation\Bootstrap\HandleExceptions- 希望有人能给我一个提示。谢谢 分布:Raspbian GNU/Linux8(

  • 问题内容: 在将非root用户添加到sudoers组的映像构建过程中,无法创建文件夹。这是我的Dockerfile: 我得到错误: 问题答案: Docker容器内的文件系统就像Docker容器外的文件系统一样工作:如果要创建文件或目录,则需要适当的权限。在这种情况下,您尝试以非root用户身份创建(因为该指令更改了用于运行其后所有命令的UID)。那是行不通的,因为它拥有并具有mode 。 请尝试:

  • 问题内容: 大喊之前,请重复!把我放进深渊,听我说。:) 我一直在为与我合作的公司开发一个Intranet站点,最初我是直接从运行 Windows 7 / IIS的 工作站开发它的。当我接近站点/应用程序的完成时,我得到了一个运行 Apache 的 Centos 7 盒子,因此我开始了将其迁移到该系统的过程。我已经解决了大部分次要问题,并且现在使网站开始运行。但是,网站的一部分与我们的数据库进行交

  • 我试图运行一个本地Jenkins管道使用Jenkinsfile的nodejs应用程序使用节点:6-alpin图像(默认)使用build.sh脚本使用调用npm安装然后我得到了以下权限错误 npm ERR!错误:EACCES:权限被拒绝,mkdir'/. npm'npm ERR!在错误(本机)npm ERR!{错误:EACCES:权限被拒绝,mkdir'/. npm'npm ERR!在错误(本机)n

  • 似乎“.dotnet”文件夹在Docker容器中受到保护。是否有一种方法可以获得对此的读/写权限,或者改变它的位置?当我猛击容器时,我似乎找不到文件夹。 谢谢你的帮助。