sna*_*agy 2 docker docker-volume
我有一个简单的 Dockerfile
FROM alpine
RUN apk add --no-cache lsyncd
CMD ["ls", "-al", "/etc/lsyncd"]
Run Code Online (Sandbox Code Playgroud)
我构建了图像,它工作正常,如果我像这样运行它,它工作正常:
docker run -i -t -P <NAME_OF_THE_IMAGE>
Run Code Online (Sandbox Code Playgroud)
我得到了包含预期文件的文件夹列表,因为 CMD 就是这样做的。
如果我将其调整为:
docker run -i -t -P -v /docker/dcm/tst:/etc/lsyncd <NAME_OF_THE_IMAGE>
Run Code Online (Sandbox Code Playgroud)
它创建了空的“/docker/dcm/tst”文件夹,并且 ls 命令也返回空。
如果我的理解是正确的,如果本地计算机上的文件夹“/docker/dcm/tst”不存在,则会创建一个新文件夹,并将文件夹“/etc/lsyncd”的内容复制到新文件夹中。
我的理解正确吗?是什么导致了我所看到的问题?
uname -a
Linux docker 4.9.53-5.ph2-esx #1-photon SMP Thu Oct 26 02:44:24 UTC 2017 x86_64 Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz GenuineIntel GNU/Linux
Run Code Online (Sandbox Code Playgroud)
命名卷和主机卷的行为不同。主机卷(也称为绑定挂载)将目录完全映射到容器中,就像主机上存在的目录一样。没有初始化过程。
当容器启动时该卷为空时,命名卷支持初始化该卷的内容。它将初始化为所选位置的镜像内容,包括文件/目录uid/gid和权限。
要获取具有主机目录的命名卷,您可以使用以下选项之一定义作为绑定安装的命名卷:
# create the volume in advance
$ docker volume create --driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
# create on the fly with --mount
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
foo
# inside a docker-compose file
...
volumes:
bind-test:
driver: local
driver_opts:
type: none
o: bind
device: /home/user/test
Run Code Online (Sandbox Code Playgroud)
据我所知,还有一个行为更改,即指向绑定安装的命名卷,如果该目录不存在,docker 将不会创建该目录。相反,容器创建将失败并出现卷创建错误。
| 归档时间: |
|
| 查看次数: |
6191 次 |
| 最近记录: |