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

Bra*_*tes 6 mysql permissions mount container docker

我遇到了 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/
Run Code Online (Sandbox Code Playgroud)

和我的挂载点(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)
Run Code Online (Sandbox Code Playgroud)

我使用的是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
Run Code Online (Sandbox Code Playgroud)

Art*_*ild 1

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

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

UUID=MY_UUID /home/user/my_mount_point    auto umask=022,defaults 0 1
Run Code Online (Sandbox Code Playgroud)

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

其次,我不明白你的卷参考docker-compose.yml。我会这样:

    volumes:
      - /home/user/my_mount_point/db-volume-folder/db-one:/var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

请注意,我总是在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
Run Code Online (Sandbox Code Playgroud)

请注意,文件夹名称db-one应与卷安装路径左侧的最后一个文件夹匹配-权限重要的文件夹。

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

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

version: "3.7"
services:
  my_sql_db:
    container_name: my_sql_db
    user: myUser
Run Code Online (Sandbox Code Playgroud)

然后文件夹权限要匹配:

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

drwxr-xr-x 3 myUser myUser 4028276 Jul 26 04:47 db-one
Run Code Online (Sandbox Code Playgroud)

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

编辑:

我刚刚使用以下 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
Run Code Online (Sandbox Code Playgroud)

这是文件夹的内容/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
Run Code Online (Sandbox Code Playgroud)

这样容器就成功起来了。看来容器本身将所有权更改为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
Run Code Online (Sandbox Code Playgroud)

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