1. VOLUME
1.1. 指令
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
1.2. 描述
VOLUME 声明存储卷,存储容器产生的有效数据。
Docker 在运行容器时会由1个或多个只读层和1层可读写的存储层组成,运行时尽量保证存储层不发生变化,在容器重建时清理存储层的数据不用考虑存储层的数据备份,便于服务的管理和可移植性。
对于类似数据库类的应用,数据是不能随意丢弃的,需要保存这些动态数据;这种情况下不能将数据保存在容器存储层,但可以将数据库文件保存到容器卷(volume)中。容器卷的生命周期和容器本身是独立的,即删除容器不会同时删除容器卷。
在 Dockerfile 中通过 VOLUME 声明挂载卷的容器内路径,用户在运行容器时需要将这些容器内的路径挂载到外部宿主机或其他容器的外部安装的卷。如果运行时没有指定,则 Docker 会自动创建一个 匿名卷 ,确保这些数据不会写入容器的存储,也不会跟随容器的删除而被清理掉,同时容器还能正常的运行。
不使用匿名卷可以在运行时通过 -v 参数来指定存储卷
docker run -d -v mydata:/data mydocker
在这行命令中,就使用了 mydata 这个命名卷挂载到了容器内 /data 这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置。这里 存储卷 mydata 可以是宿主机的路径,也可以是通过 docker volume 创建的卷。
Dockerfile 中 VOLUME 该值可以是JSON数组
VOLUME ["/var/log/"]
也可以是具有多个参数的纯字符串,例如
VOLUME /var/log
或
VOLUME /var/log /var/db
1.3. 注意事项
1.3.1. 使用基于 Windows 的容器时卷时,容器内的卷的目的地必须是以下之一:
不存在或空目录
- 除 驱动器 C: 外的其他驱动器
1.3.2. 从Dockerfile内更改卷:
如果在声明了卷后有任何构建步骤更改了卷内的数据,则这些更改将被丢弃。
1.3.3. JSON格式:
列表被解析为JSON数组。您必须用双引号(")而不是单引号(')括住单词。
1.3.4. 主机目录是在容器运行时声明的:
主机目录(挂载点)从本质上说是依赖于主机的。这是为了保留图像的可移植性,因为不能保证给定的主机目录在所有主机上都可用。因此,您无法从Dockerfile内挂载主机目录。该VOLUME指令不支持指定host-dir 参数。创建或运行容器时,必须指定安装点。