不允许对卷进行 Docker-compose 挂载的文件系统操作

不允许对卷进行 Docker-compose 挂载的文件系统操作

我在使用 docker-compose 时遇到问题,它在已安装硬盘上的文件夹中安装卷。我见过很多解决方案,并且老实说,我都试过了。

我将我正在使用的用户的权限更改为 root、docker,并分别位于其各自的组中。没有

写入操作工作正常,我可以通过 python 写入文件,不受限制,但是当我运行 docker compose 来创建 sql db 时,它给了我这个:

错误:对于 mysql_db 无法启动服务 mysql_db:创建挂载源路径“/db-path-mount”时出错:chown /db-path-mount/db-volume-folder/db-one:操作不允许

错误:对于 mysql_db 无法启动服务 mysql_db:创建挂载源路径“/db-path-mount”时出错:chown /db-path-mount/db-volume-folder/db-one:操作不允许错误:启动项目时遇到错误。

似乎故障排除很少,我尝试了 docker-compose up -d 和 sudo docker-compose up -d,但没有什么变化。

drwxr-xr-x 3 myUser docker 4028276 Jul 26 04:47 db-volume-folder/

和我的挂载点(etc/fstab):

UUID=MY_UUID /home/user/my_mount_point    auto uid=1001,gid=122,umask=022,defaults 0 1

(gid=122 is docker)
(uid=1001 is user)

我正在使用 ubuntu 20 服务器

docker-compose.yml:

version: "3.7"
services:
  my_sql_db:
    container_name: my_sql_db
    user: root
    image: mysql/mysql-server:latest
    ports:
      - "1533:3306"
    env_file:
      - secrets/sqlserver.env
      - secrets/sqlpassword.env
    volumes:
      - ./db-path-mount/db-volume-folder/db-one:/var/lib/mysql

答案1

您的设置中有一些事情我会做不同的事情,我会尝试在我的回答中概述这一点。我不能保证它会起作用,但这就是我设置容器的方式,所以希望它能有所帮助。

首先,我不会使用uidgid属性来挂载我的数据盘。我会使用默认属性来挂载,如下所示:

UUID=MY_UUID /home/user/my_mount_point    auto umask=022,defaults 0 1

(从现在开始,我将使用/home/user/my_mount_point您的磁盘安装位置作为参考。)

其次,我不明白您在 中的音量引用docker-compose.yml。我会这样说:

    volumes:
      - /home/user/my_mount_point/db-volume-folder/db-one:/var/lib/mysql

请注意,我始终会在中使用绝对路径docker-compose.yml

此外,所有权应与正在运行的容器的所有权相匹配,因此该文件夹db-one应由 root 拥有。

myUser@ubuntu:~/my_mount_point/db-volume-folder$

drwxr-xr-x 3 root root 4028276 Jul 26 04:47 db-one

请注意,文件夹名称db-one应该与最后一个文件夹左边在卷安装路径中 - 这是权限重要的文件夹。

最后,正如您所注意到的,docker-compose 还支持您指定容器应以哪个用户身份运行。因此,我相信您可以更改用户,然后相应地更改所有权。

因此,如果你像这样更改用户:

version: "3.7"
services:
  my_sql_db:
    container_name: my_sql_db
    user: myUser

然后将文件夹权限匹配:

myUser@ubuntu:~/my_mount_point/db-volume-folder$

drwxr-xr-x 3 myUser myUser 4028276 Jul 26 04:47 db-one

我希望这些说明中的一些对您有用 - 如果有用,请告诉我们。

编辑:

我刚刚使用以下 docker-compose.yml 测试了 MySql 容器:

version: "3.7"

services:

  my_sql_db:
    container_name: my_sql_db
    user: root
    image: mysql/mysql-server:latest
    ports:
      - "1533:3306"
    environment:
      MYSQL_ROOT_PASSWORD: topsecret
      MYSQL_USER: mysqluser
      MYSQL_PASSWORD: mysqlpassword
    volumes:
      - /mnt/zfs/docker-data/mysql-test/db-one:/var/lib/mysql
    restart: always

这是文件夹的内容/mnt/zfs/docker-data/mysql-test

/mnt/zfs/docker-data/mysql-test$ ls -la
total 7
drwxr-xr-x  3 root root   4 Aug  1 22:02 .
drwxr-xr-x 22 root root  22 Aug  1 21:47 ..
drwxr-xr-x  6   27 sudo  30 Aug  1 21:59 db-one
-rw-r--r--  1 root root 374 Aug  1 21:58 docker-compose.yml

这样,容器就成功启动了。容器本身似乎将所有权更改为27:sudo(我猜这些是默认值)。

如果我将用户更改为docker-compose.ymlmyuser:myuser并将文件夹的权限更改db-onemyuser:myuser,则在尝试启动容器时会出现此错误:

ERROR: for my_sql_db  Cannot start service my_sql_db: unable to find user myuser: no matching entries in passwd file

因此,问题似乎出在匹配用户之间,而不是文件系统所有权之间。如果您遇到另一个错误,则可能是文件系统所有权以外的其他问题 - 请参阅评论中的链接。

相关内容