我在使用 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
您的设置中有一些事情我会做不同的事情,我会尝试在我的回答中概述这一点。我不能保证它会起作用,但这就是我设置容器的方式,所以希望它能有所帮助。
首先,我不会使用uid
和gid
属性来挂载我的数据盘。我会使用默认属性来挂载,如下所示:
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.yml
,myuser:myuser
并将文件夹的权限更改db-one
为myuser:myuser
,则在尝试启动容器时会出现此错误:
ERROR: for my_sql_db Cannot start service my_sql_db: unable to find user myuser: no matching entries in passwd file
因此,问题似乎出在匹配用户之间,而不是文件系统所有权之间。如果您遇到另一个错误,则可能是文件系统所有权以外的其他问题 - 请参阅评论中的链接。