# VOLUME

```
VOLUME ["/data"]
```

**VOLUME指令**通过一个指定的名称创建一个挂载点，然后将它标记为持有一个来自本地主机或其他容器的外部挂载卷。它的值可以是一个**JSON数组**，**VOLUME\["/var/log/"]**，或者是有多个参数的纯字符串，例如**VOLUME /var/log**或**VOLUME /var/log /var/db**。对于更多的信息或示例以及**Docker client**的挂载指令，参考[**通过卷共享目录**](https://app.gitbook.com/s/-MVjOb1Mk_y7lcQcI_LJ/dockerfile-zhi-ling/:/docs.docker.com/storage/volumes/)。

**docker run**命令将对基础镜像中的指定位置已经存在的最新创建的卷用数据进行初始化。例如，请考虑以下**Dockerfile**片段：

```
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
```

上面的**Dockerfile**会让**docker run**在 **/myvol**处创建一个新的挂载点，并将新创建的**greeting**文件复制到新创建的卷中。

**关于指定卷的注意点：**

关于**Dockerfile**中的卷需要记住以下几件事情：

* 基于**windows**容器的卷：当使用基于**windows**的容器时，容器内部一个卷的目的地必须符合下面两种情况中的一个：
  * 一个不存在的或空的目录
  * 除了**C:**&#x4EE5;外的驱动器
* 从**Dockerfile**内部更改卷：如果构建步骤在数据被声明后又更改了卷内的数据，则这些更改将被丢弃。
* **JSON**格式：列表会被解析为一个**JSON数组**，因此必须用**双引号**包围单词而不是**单引号**。&#x20;
* 在容器的运行时声明主机目录：主机目录（挂载点）本质上是主机依赖的。这是为了保持镜像的便携性，因为无法保证提供的一个主机目录在所有主机上都是可用的。因此，我们无法从**Dockerfile**中挂载主机目录。**VOLUME指令**不支持指定**host-dir**参数。当我们创建或运行容器时，必须指定挂载点。
