Docker 撰写卷权限 linux

Posted

技术标签:

【中文标题】Docker 撰写卷权限 linux【英文标题】:Docker compose volume Permissions linux 【发布时间】:2019-03-25 20:10:52 【问题描述】:

我尝试在 docker 容器中运行 wordpress,我的 docker-compose.yaml 文件是:

version: "2"
services:
  my-wpdb:
    image: mariadb
    ports:
      - "8081:3306"
    environment:
      mysql_ROOT_PASSWORD: ChangeMeIfYouWant
  my-wp:
    image: wordpress
    volumes:
      - ./:/var/www/html
    ports:
      - "8080:80"
    links:
      - my-wpdb:mysql
    environment:
      WORDPRESS_DB_PASSWORD: ChangeMeIfYouWant

当我构建 docker 结构时,卷已挂载但属于 root。

我试图改变它:

my-wp:
  image: wordpress
  user: 1000:1000    # added
  volumes:
    - ./:/var/www/html
  ports:
    - "8080:80"
  links:
    - my-wpdb:mysql
  environment:
    WORDPRESS_DB_PASSWORD: ChangeMeIfYouWant

现在我可以编辑文件了。但随后容器不再为网站提供服务。

解决此权限问题的正确方法是什么?

【问题讨论】:

这个答案解决了你的问题还是你遇到了进一步的问题? 【参考方案1】:

根据docker-compose 和docker run 参考,user 选项设置容器中运行的进程的用户标识(和组标识)。如果您将其设置为1000:1000,您的网络服务器将无法再绑定到端口 80。绑定到低于 1024 的端口需要 root 权限。这意味着您应该再次删除添加的user: 1000:1000 语句。

要解决共享卷的权限问题,您需要更改目录的所有权。运行chown 1000:1000 /path/to/volume。这可以在容器内或直接在主机系统上执行。更改是持久且立即生效的(无需重新启动容器)。

一般来说,我认为该卷应该在一个子目录中,例如

  volumes:
    - ./public:/var/www/html

确保正确的用户拥有./public。如果您启动容器并且该目录不存在,docker 会为您创建它。在这种情况下,该目录归 root 所有,您需要按照上述说明手动更改所有权。


或者,您可以以非特权用户 (user: 1000:1000) 运行网络服务器,让服务器侦听端口 8080 并将路由更改为

 ports:
    - "8080:8080"

【讨论】:

确保正确的用户拥有 ./public。如果您启动容器并且该目录不存在,docker 会为您创建它。在这种情况下,该目录归 root 所有,您需要按照上面的说明手动更改所有权。 在查找 root 权限问题几天后,我终于在您的回复中找到了答案。如果在运行构建之前该文件夹不存在,我不知道权限将设置为 root。这是我认为应该在 docker 文档中明确说明的重要信息;但要么不是,要么我以某种方式错过了它。 @sauerburger 我还有一个问题。 Docker(或 Postgres Image、IDK)首次创建挂载目录(docker-compose up --build)。但如果我两次运行相同的命令,它会给我 permission denied。我检查了权限,它是:systemd-coredump。为什么? @mohammadjawadBarati 在没有更多上下文的情况下很难调试,请考虑打开一个单独的问题。但是,postgres 映像在内部使用用户 postgres 和 uid 999。映射到用户 ID 的用户名很可能在您的主机系统上不同,因此将不相关的用户名显示为所有者。 @sauerburger,这是my question。 但是您无法在启动失败的容器中运行命令。【参考方案2】:

已回复same question 在您的 docker-compose 中使用 root 用户来获得完全权限

前:-

node-app:
    container_name: node-app
    image: node
    user: root
    volumes:
      - ./:/home/node/app
      - ./node_modules:/home/node/app/node_modules
      - ./.env.docker:/home/node/app/.env

注意:- user: root => 给你你的卷的完全权限

【讨论】:

【参考方案3】:

我在使用 Google Cloud shell 时发现以下命令为我启用了正确的权限,以便我通过 WordPress docker 容器使用 FTP 文件访问:

sudo chmod 644 -R wordpress-docker-compose

【讨论】:

永远不要使用777,那就像要求被抢劫一样。 是的,这只是一个例子。我应该改变它,因为我得到了反对票:-)

以上是关于Docker 撰写卷权限 linux的主要内容,如果未能解决你的问题,请参考以下文章

linuxdocker设置禁止外部访问

Docker撰写 - 在几个容器和主机上装载卷

Docker Volume 之权限管理

Docker Volume 之权限管理

使用主机挂载卷的 Docker 权限开发环境

解决 Docker 数据卷挂载的文件权限问题