我有以下docker文件
RUN touch /root/testing
VOLUME ["/root"]
在我构建并检查后,在配置下,我看到了
"Volumes": {
"/root": {}
},
在我运行/ bin / bash并检查之后
"Mounts": [
{
"Type": "volume",
"Name": "fc1dc25de37d6d7593a21443cd2bef74a0a6a4e3276b8353199054404665c398",
"Source": "/var/lib/docker/volumes/fc1dc25de37d6d7593a21443cd2bef74a0a6a4e3276b8353199054404665c398/_data",
"Destination": "/root",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
启动容器时,它将创建一个本地卷并将其安装在/root
上。还将/root
的内容复制到本地挂载
如果我在主机上这样做,我们可以在其中看到testing
文件
ls /var/lib/docker/volumes/fc1dc25de37d6d7593a21443cd2bef74a0a6a4e3276b8353199054404665c398/_data
testing
但是在杀死该容器后,本地卷将立即被破坏。
那么本地卷的目的是什么。因为有时我会误将容器杀死,但仍然希望容器中的某些数据存储在本地卷上,所以这是不可能的,因为本地卷也已删除。
我想尝试命名卷。
我创建了
docker volume create test
然后我是我的docker文件:
RUN touch /root/testing
VOLUME [{"Name":"test","Destination":"/root","external":"true"}]
OR
VOLUME [ "Name:{"Destination":"/root","external":"true"}"]
当我尝试构建时,我得到:
Error response from daemon: when using JSON array syntax, arrays must be comprised of strings only
然后剩下的唯一选项是从命令行而不是Dockerfile挂载卷
docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash
[root@7c7001221c14 /]# ls /root
testing
现在我检查测试体积的内容:
$ docker run --rm -it --mount source=test,destination=/tmp/myvolume archlinux/base ls /tmp/myvolume
testing
此处,由于测试卷完全为空,因此当我docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash
进入卷测试时,它从映像中复制了/ root的内容(即文件测试)
但是如果test
之前的docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash
卷不为空,即
sudo cd /var/lib/docker/volumes/test/_data
rm -rf *
mkdir hellophp
然后做
docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash
[root @ 7c7001221c14 /]#ls / root hellophp
所以我的观察是:
---- VOLUME ["/path/in/container/"]
仅会创建local volumes
,我们在这里不能使用named volumes
----如果我想使用named volumes
,那么
a)创建一个命名卷
docker volume create test
b)将命名卷安装到容器路径中
--mount source=test,destination=/path/in/container
------ ***最重要的观察
如果命名卷为空 (其中没有文件),则在runnnig之后
docker run --rm -it --mount source=test,destination=/path/in/container IMAGENAME CMD
它将/path/in/container
的内容复制到test
卷,然后将test
卷挂载到/path/in/container
ELSE(即命名卷中包含一些文件) ,然后运行后
docker run --rm -it --mount source = test,destination = / path / in / container IMAGENAME CMD
在安装之前,它不会通过将文件从test
复制到/path/in/container
卷来更改test
卷。
它将在test
上安装/path/in/container
卷。因此/path/in/container
中存在的任何文件在容器中将不可用。
答案 0 :(得分:0)
如果您正在docker中运行数据库,则可以使用run命令上的-v选项将本地目录直接安装到容器中。
docker run -d \
-v <local path>:<container path>:z \
..
..
<your image>
实际存储将保留在本地文件系统上,并且在容器运行时可以在容器中访问。