Dockerfile卷命令,作为bindmount装载时数据丢失

Dockerfile卷命令,作为bindmount装载时数据丢失,docker,dockerfile,Docker,Dockerfile,我创建了一个Dockerfile并用bindMount运行了容器,内容丢失了,没有内容 FROM alpine:3.8 RUN mkdir /myvol RUN echo "hello world" > /myvol/greeting VOLUME /myvol docker run -it --name volDemo2 -v $(pwd)/myvol:/myvol voldemo sh 我希望pwd下的myvol应该包含问候语,但事实并非如此 root@default:/hom

我创建了一个Dockerfile并用bindMount运行了容器,内容丢失了,没有内容

FROM alpine:3.8
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

docker run -it --name volDemo2 -v $(pwd)/myvol:/myvol voldemo sh
我希望pwd下的myvol应该包含问候语,但事实并非如此

  root@default:/home/docker# docker run -it --name volDemo2 -v $(pwd)/myvol:/myvol voldemo sh           
/ # cd myvol/                                                                                         
/myvol # ls                                                                                           
/myvol # 
但是,如果按照以下方式安装,同样可以正常工作

docker@default:~$ docker run -it --name volDemo1 -v myvol:/myvol voldemo sh  
/ # cd myvol/                                                                
/myvol # ls                                                                  
1.txt     greeting                                                           
/myvol # exit 

如果这是预期的行为,卷指令将仅与卷一起工作,而不与绑定装载一起工作

这就是绑定装载的工作方式。它们将一个文件夹装载到文件系统的另一个路径中。对目标路径的所有访问将直接映射回源目录

docker为命名卷提供的第二个示例是当容器创建时命名卷为空时的初始化步骤。在容器启动之前,他们会将所有文件、目录和元数据(如文件所有者和权限)从映像文件系统复制到命名卷中。这只会发生在命名卷上,而不会发生在主机装载或tmpfs卷上。这只在命名卷为空时发生,因此它不会在更改映像时更新

通过传递附加选项,可以创建一个在主机上装载其他目录的命名卷,在主机装载和默认命名卷之间提供一些内容,因为它们都是通过绑定装载实现的。以下是三个不同的例子:

  # 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
  ...
如果您的目标是为映像的其他用户保持简单,并可能使用映像的新版本更新卷,那么您将希望在entrypoint脚本中这样做。我在我的基础图片中包含了我的图片。您将卷目录复制到映像内的安全位置,然后在容器启动时,entrypoint脚本将文件复制到卷中。

所以主机上有myvol文件夹,该文件夹已装载到容器中,它在主机文件夹中包含问候语,但不在容器中?