Docker:尝试了解Dockerfile中的体积

时间:2019-03-15 04:25:43

标签: docker docker-volume

首先创建一个卷sample_vol

docker volume create sample_vol

我的Dockerfile

FROM archlinux/base

RUN touch /root/testing  [**edited** find note at RUN below]

# VOLUME sample_vol:/root  [**edited** this will not work, because VOLUME will not accpet named volumes. So this will not mount at /root, it will mount at sample_vol:/root which does not exist]

VOLUME "/root" or VOLUME ["/root"] [**edited** this will create a local mount volume only till the time the container is running. I tried to use named volumes like VOLUME ["name:/root"] but didnt work ]

# RUN touch /root/testing   [**edited** this will not work because volume when mounted will only copy files till it got declared]

制作图片

docker build -t archlinux/sample_vol .

检查是否在sample_vol中创建了测试文件

docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base ls /tmp/myvolume 

它不显示已创建的任何文件测试

同时

$ docker run --rm -it --name sample_vol archlinux/sample_vol ls /root/testing

它显示文件testing是在构建映像的/root/中创建的

因此,为什么未将sample_vol安装在/root上并在其中创建testing的原因。

更新:我找到原因可能是由于

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#volume

  

在Dockerfile中更改卷:如果有构建步骤   在声明后更改卷中的数据,那些   更改将被丢弃。

1 个答案:

答案 0 :(得分:0)

您误解了docker-volume。

Docker-Image更多关于构建时间。 Docker-Volume仅在运行时有用。

尝试运行以下命令以了解主意:

docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base touch /tmp/myvolume/1.txt
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base touch /tmp/myvolume/2.txt
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base touch /tmp/myvolume/3.txt
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base ls -altr  /tmp/myvolume/

第一个容器在挂载在/ tmp / myvolume的docker卷中创建文件1.txt,然后在执行此操作后删除容器。
第二个容器在挂载在/ tmp / myvolume的docker卷中创建文件2.txt,然后在执行此操作后删除容器。
第三个容器在挂载在/ tmp / myvolume的docker卷中创建文件3.txt,然后在执行此操作后删除容器。
挂载在/ tmp / myvolume的docker卷中的第4个容器列表文件,然后在执行此操作后删除容器。

Docker卷是在容器生命周期之外存储持久性数据,这意味着当您删除容器时,您仍然可以将数据存储在容器之外。

因此,下次如果您创建一个容器并附加该docker卷-您将自动使用新容器获取所有数据。

请考虑一个数据库映像示例,在该数据库映像中您要批量存储数据,以便在将容器更改为更高版本时-您将在新数据库中获取旧数据。