我有一个简单的Dockerfile
FROM alpine
RUN apk add --no-cache lsyncd
CMD ["ls", "-al", "/etc/lsyncd"]
我构建了图像并且工作正常,如果我像以下那样运行它可以正常工作:
docker run -i -t -P <NAME_OF_THE_IMAGE>
我得到了包含预期文件的文件夹列表,因为CMD会这样做。
如果我像它一样:
docker run -i -t -P -v /docker/dcm/tst:/etc/lsyncd <NAME_OF_THE_IMAGE>
它创建了“/ 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
答案 0 :(得分:3)
命名卷和主机卷的行为不同。主机卷(又称绑定装载)将目录映射到容器中,与主机上存在的完全相同。没有初始化过程。
命名卷支持在容器启动时该卷为空时初始化卷的内容。它将初始化为所选位置的图像内容,包括文件/目录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
我知道有一个其他的行为更改,指定卷指向绑定装载,如果目录不存在,则docker不会创建该目录。相反,容器创建将因卷创建错误而失败。
答案 1 :(得分:1)
public int? PopPort { get; set; }
是指主机上的文件或目录安装到容器中
关于Bind mount
,如下所述。
如果将bind-mount绑定到容器上的非空目录,则绑定装置会隐藏目录的现有内容。
有关详细信息,请参阅this。
这意味着Mounting into a non-empty directory on the container
只会覆盖容器目录中的内容。
我认为您已经与bind mount
混淆了,volume
会在第一次创建时将容器目录中的内容复制到volume
。但是,您使用的是bind mount
,并且它不会那样工作。