在编写Dockerfile时,我正在寻找关于VOLUME条目的解释,并遇到了以下语句
卷是存储在/var/lib/docker/volumes/...
中的持久数据
您可以在Dockerfile
中声明它,这意味着每次从映像启动容器时,都会创建卷(空),即使您没有任何-v
选项。
你可以在运行时docker run -v [host-dir:]container-dir
上声明它。将两者结合起来(VOLUME
+ docker run -v
)意味着您可以将主机文件夹的内容装载到/var/lib/docker/volumes/...
中的容器所保持的卷中docker volume create
创建卷,而无需定义Dockerfile
并构建映像和运行容器。它用于快速地允许其他容器安装所述体积。
但我很难理解这句话:
...将两者结合起来(VOLUME
+ docker run -v
)意味着您可以将主机文件夹的内容装载到/var/lib/docker/volumes/...
中的容器持久化的卷中
例如,假设我的主机上有一个配置文件,我运行基于我用Dockerfile
编写的映像的容器。它会复制配置文件到我在我的卷条目中声明的卷中吗?
它会是类似于(伪代码)的东西吗
#dockerfile
From Ubuntu
Run apt-get update
Run apt-get install mysql
Volume . /etc/mysql/conf.d
Cmd systemcl start MySQL
当我运行它
docker run -it -v /path/to/config/file: ubuntu_based_image
这是他们的意思吗?
1条答案
按热度按时间3qpi33ja1#
VOLUME
。它不需要在运行时挂载文件或目录,而且它有令人困惑的副作用,比如使后续的RUN
命令悄悄地丢失状态。VOLUME
,并且在启动容器时没有挂载任何其他东西,Docker将创建一个匿名卷并为您挂载它。如果不清理这些卷,可能会导致空间泄漏。docker run -v
选项,无论它是否声明为VOLUME
。docker run -v /host/path:/container/path
,这两个目录实际上是相同的;没有任何内容被复制,并且对一个的写入(应该是)在另一个上立即可见。docker run -v /host/path:/container/path
绑定挂载在/var/lib/docker
中根本不可见。/var/lib/docker
中的内容(如果您不在本地Linux主机上,也不能查看)。如果需要直接访问卷文件内容,请使用绑定挂载,而不要使用命名卷或匿名卷。