docker-compose中顶级volumes自定义绑定路径

问题

举例子能说明问题:

docker-compose.yml中的一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
service:
database:
image: mariadb:10
environment:
- MYSQL_USER=xxx
- MYSQL_PASSWORD=xxx
- MYSQL_DATABASE=xxx
- MYSQL_ALLOW_EMPTY_PASSWORD=true
# volume下使用
volumes:
- database:/var/lib/mysql

volumes:
# 由docker volume创建volumes定义的卷,可以通过参数指定属性
# 可以不填写任何参数,按默认属性在/var/lib/docker/volumes下创建卷
### 本文想在这里自定义路径
database:

解决方式

1
2
3
4
5
6
volumes:
database:
driver_opts: #更多选项可以查看Linux的Mount命令,与Mount相似
type: ext4 # 文件类型,必需
o: bind
device: <absolute path> # 绝对路径

附录:

  1. 本文问题的缘由:一开始只是以为顶级volumes的含义只是用来缩写,由于services下<path1>:<path2>中的宿主机路径太长,想缩减<path1>:<path2>的长度,使代码更加美观。

    实际上对顶级volumes的理解是不对的,顶级volumes的意义并不是为缩写。

    实现上述目的应该通过下面方式实现。

    1
    2
    3
    4
    5
    6
    services:
    database:
    volumes:
    type: bind
    source: <path1> # 绝对路径或是相对路径
    target: <path2> # 绝对路径或是相对路径
  1. 那顶级volume的含义真正是什么?

    实际上,顶级volums的含义是指用docker volume create命令创建卷,并交由docker volume管理这些卷,关联容器中的路径。

  2. 那本文的一顿操作到底做了些什么?

    实际上宿主机卷仍然是由docker volume管理并关联容器中的路径。也就是说,选项odevice只不过是将docker volume管理的卷再次绑定到device指向的位置

    1. docker volume管理的卷截图

      docker volume管理的卷

      image.png

    2. 可以验证的是:device指向的位置、/var/lib/docker/volume/<name>/_data、容器内的路径,三者的内容是一样的。

      device指向的位置截图:

      device指向位置

      ​ docker volume默认的宿主机位置(指向/var/lib/docker/volumes/<name>/_data)

      docker volume默认的宿主机位置

      ​ docker容器内部目录:

      docker容器内部目录

    3. 来自docker-compose中关于driver_opts的解释:docker-compose driver_opts

      引用:以键值对的形式指定用来传递给该数据卷所使用的数据卷驱动的列表选项

      1
      2
      3
      4
      5
      6
      volumes:
      example:
      driver_opts:
      type: "nfs"
      o: "addr=10.40.0.199,nolock,soft,rw"
      device: ":/docker/example"

      这里的例子与本文很相似。

    4. 所以,本文的意义可能在于将docker volume管理的卷,再克隆一份到其他路径,多处进行持久化。🤔🤔🤔

所以,从一开始理解错了顶级volumes的用法,从而走了弯路。

最后,通过这次经历,我也有些明白了顶级volumes的含义。

参考链接: