精华内容
下载资源
问答
  • Dockerfile volume 测试

    2019-05-13 14:19:58
    Dockerfile volume 测试 最近在使用开源Image 作为基础进行新image创建的时候,遇到Volume问题,特进行测试并进行记录。 使用busybox 作为最基础的image,创建以下dockerfile volume 基础镜像Dockerfile base-...

    Dockerfile volume 测试

    最近在使用开源Image 作为基础进行新image创建的时候,遇到Volume问题,特进行测试并进行记录。

    使用busybox 作为最基础的image,创建以下dockerfile

    • volume 基础镜像Dockerfile base-Dockerfile

        FROM busybox 
        RUN   mkdir /volume /commdir
        RUN  adduser --uid 111 test -D
        RUN touch /volume/filebefore
        VOLUME /volume
        RUN touch /volume/fileafter
        ADD ./basetest /volume
      
    • 子image ,Dockerfile

        FROM volume-test-base
        COPY ./test /volume/test
        COPY ./test /commdir/test
        RUN chown -hR test /volume
        RUN chown -hR test /commdir
      
    • 一个测试脚本

        echo "test" >./test
        echo "base" >./basetest
        docker build -t volume-test-base . -f base-Dockerfile  --no-cache 
        docker build -t volume-test  .  --no-cache 
        docker run --rm -it volume-test  ls  -ltr /commdir 
        docker run --rm -it volume-test  ls  -ltr /volume 
      
        docker run --rm -it volume-test-base   ls  -ltr /volume 
      

    运行结果如下:

     root@flannel:/media/psf/57root/dockerfile-volume-test# ./test.sh
    Sending build context to Docker daemon  6.144kB
    Step 1/7 : FROM busybox
     ---> 7968321274dc
    Step 2/7 : RUN mkdir /volume /commdir
     ---> Running in a2488b3340a7
     ---> 6110c6a34c7b
    Removing intermediate container a2488b3340a7
    Step 3/7 : RUN adduser --uid 111 test -D
     ---> Running in 72eaa1f07426
     ---> f1f4995f8751
    Removing intermediate container 72eaa1f07426
    Step 4/7 : RUN touch /volume/filebefore
     ---> Running in b11a1bacb99f
     ---> 2c16779576d9
    Removing intermediate container b11a1bacb99f
    Step 5/7 : VOLUME /volume
     ---> Running in ae30df4e3bd3
     ---> fa81508eca60
    Removing intermediate container ae30df4e3bd3
    Step 6/7 : RUN touch /volume/fileafter
     ---> Running in a873cc8a0038
     ---> 9119dfff6d69
    Removing intermediate container a873cc8a0038
    Step 7/7 : ADD ./basetest /volume
     ---> 25b66efc3f7e
    Removing intermediate container 10df898a8bbb
    Successfully built 25b66efc3f7e
    Successfully tagged volume-test-base:latest
    Sending build context to Docker daemon  6.144kB
    Step 1/5 : FROM volume-test-base
     ---> 25b66efc3f7e
    Step 2/5 : COPY ./test /volume/test
     ---> ee3f4f23b10c
    Removing intermediate container 8dcc417ab135
    Step 3/5 : COPY ./test /commdir/test
     ---> 37b823ebb23a
    Removing intermediate container e85340587c47
    Step 4/5 : RUN chown -hR test /volume
     ---> Running in 137e7d72d4b7
     ---> a2b155e02fad
    Removing intermediate container 137e7d72d4b7
    Step 5/5 : RUN chown -hR test /commdir
     ---> Running in acc3ffc39114
     ---> 02454129541c
    Removing intermediate container acc3ffc39114
    Successfully built 02454129541c
    Successfully tagged volume-test:latest
    total 4
    -rw-r--r--    1 test     root             5 Aug 18 15:51 test
    total 8
    -rw-r--r--    1 root     root             5 Aug 18 15:51 test
    -rw-r--r--    1 root     root             5 Aug 18 15:51 basetest
    -rw-r--r--    1 root     root             0 Aug 18 15:51 filebefore
    total 4
    -rw-r--r--    1 root     root             5 Aug 18 15:51 basetest
    -rw-r--r--    1 root     root             0 Aug 18 15:51 filebefore
    

    可以看到:

    • 所有文件被保存在volume中
    • 所有在VOLUMNE 的操作都没有被保存,无论是touch 还是chown

    查看volume 也可以看到文件owner还都是root

        root@flannel:/media/psf/57root/robert-gz.github.io/_posts# docker run -d -it volume-test sh -c cat
        73526055f3b4896f63e74ed8b2d801610e7cadea05dcce583b0450c019da9564
        root@flannel:/media/psf/57root/robert-gz.github.io/_posts# docker ps
        CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
        73526055f3b4        volume-test         "sh -c cat"         2 seconds ago       Up 2 seconds                            elated_darwin
        root@flannel:/media/psf/57root/robert-gz.github.io/_posts# docker volume ls
        DRIVER              VOLUME NAME
        local               e5b8d7b756457713846bff2234016b0dd05a59a1303ac416197b8e9ece664d25
        root@flannel:/media/psf/57root/robert-gz.github.io/_posts# ls -ltr /var/lib/docker/volumes/e5b8d7b756457713846bff2234016b0dd05a59a1303ac416197b8e9ece664d25/_data
        total 8
        -rw-r--r-- 1 root root 5 Aug 18 23:51 test
        -rw-r--r-- 1 root root 5 Aug 18 23:51 basetest
        -rw-r--r-- 1 root root 0 Aug 18 23:51 filebefore
    

    总之,dockerfile 里面volume 存放文件没有问题,但如果要修改用户及其它操作,必须在容器启动后自行处理,dockerfile里面设置是无效的

    展开全文
  • Dockerfile vs. docker-compose.yml Dockerfile reference Compose file version 3 reference First we should know, Dockerfile is not docker-compose.yml. Dockerfile is the file run by docker build -t ...
    
    

    First we should know, Dockerfile is not docker-compose.yml.

    Dockerfile is the file run by docker build -t image:tag . for making a docker image.

    But the docker-compose.yml is the file run by docker-compose up for start a docker container or several containers.

    They are both files that collecting many orders, which make the building process clearly and organized.

    • Volumes in docker

      From Volumes and Dockerfiles Don’t Mix , Volumes with Docker are a popular topic.

      1. Don’t Create Volumes Inside a Dockerfile

        The practice which Specifying a Volume through creating an image, has no upside, and lots of problems that it creates:

        • Issue#1 Anonymous Volumes

          Defining a volume inside the image tells docker to store this data separate from the rest of the container, even if you don’t define the volume when you spin up the container.

          Docker’s way of storing this data is to create a local volume without a name.

          The name itself is a long unique id string that contains no reference to the image or container it’s attached to.

          And unless you explictly tell docker to remove volumes when you remove the container, these volumes remain ,unlikely to ever be used again:

          # 查看dockerfile定义的volume
          docker volume ls
          # 删除dockerfile定义的volume
          
        • Issue#2 You Cannot Modify a Volume Once Created, Sometimes
        • Issue#3 Derived Images Cannot Modify the Volume Either
      2. You can Use Volumes Without Defining Them Inside the Image

        All of these issues begs the question:

        “If I shouldn’t define volumes inside the Dockerfile, then how can I use volumes in docker?”

        "use the docker-compose.yml or docker run "

        From docker-compse.yml or docker run methods, you can not only define your volume, but you can give it a name.

    • docker-compose.yml

      From Frequently asked questions on docker docs, The volume (docker-compose.yml) overrides the directory contents of the image.

    • References

    1. Dockerfile vs. docker-compose VOLUME
    2. What is the difference between YAML and JSON?
    展开全文
  • Dockerfile Volume指令与docker -v的区别

    万次阅读 2019-03-28 17:06:51
    在学习Dockerfile的过程中VOLUME命令,很多教程或书中说的是用来定义匿名卷的,其作用如下:  容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存 动态数据的应用,其数据库文件应该保存于...

    在学习Dockerfile的过程中有个VOLUME命令,很多教程或书中说的是用来定义匿名卷的,其作用如下:

      容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存
    动态数据的应用,其数据库文件应该保存于卷(volume)中,后面的章节我们会进一步介绍
    Docker 卷的概念。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在
    Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂
    载,其应用也可以正常运行,不会向容器存储层写入大量数据。
      这领我们想起docker的run命令中的 "-v"参数的作用

    # docker run --help | grep volume
      -v, --volume list                    Bind mount a volume
          --volume-driver string           Optional volume driver for the container
          --volumes-from list              Mount volumes from the specified

       那么Dockerfile中的VOLUME指令实际使用中是不是就是跟docker run中的-v参数一样是将宿主机的一个目录绑定到容器中的目录以达到共享目录的作用呢?并不然,其实VOLUME指令只是起到了声明了容器中的目录作为匿名卷,但是并没有将匿名卷绑定到宿主机指定目录的功能。但是当我们生成镜像的Dockerfile中以Volume声明了匿名卷,并且我们以这个镜像run了一个容器的时候,docker会在安装目录下的指定目录下面生成一个目录来绑定容器的匿名卷(这个指定目录不同版本的docker会有所不同)。如我使用的版本如下:

    # docker --version
    Docker version 18.09.0, build 4d60db4    //docker版本
    # pwd
    /var/lib/docker/volumes          //默认绑定容器的匿名卷的目录
    # ll
    total 32
    drwxr-xr-x. 3 root root  4096 Nov 25 20:18 593fda6d7b8296bfca22894b326727c734133eebb11c9bc2c25a73b892157a37  //其中一个容器的共享目录文件夹
    drwxr-xr-x. 3 root root  4096 Nov 25 20:14 78d890eeb15ac6295484d5e84e97928e981b01501fa40bac40b965fc9e54899a  //其中一个容器的共享目录文件夹
    -rw-------. 1 root root 32768 Nov 25 20:18 metadata.db

       就是说当Dockerfile中声明了匿名卷但是run的时候没有使用 -v绑定匿名卷的话那么docker就会在/var/lib/docker/volumes这个目录下创建一个目录来绑定匿名卷。

      所以真正使用的时候我们在Dockerfile构建镜像的时候如:

    FROM centos:latest
    RUN groupadd -r redis && useradd  -r -g redis redis
    RUN yum -y update &&  yum -y install epel-release && yum -y install redis && yum -y install net-tools
    
    RUN mkdir -p /config && chown -R redis:redis /config
    
    
    VOLUME /share/data      #声明容器中/share/data为匿名卷
    
    
    EXPOSE 6379

       那么使用该Dockerfile构建镜像的为

    # docker build -t image-redis    //构建镜像image-redis
    ......
    #docker run -itd -name redis1 -v /data:/share/data image-redis    //运行一个容器并且将当前机器的/data目录绑定到容器的匿名卷中
    .....
    #docker run -itd  -name redis2 image-redis     //运行一个容器但是不绑定目录到容器的匿名卷,这时候再/var/lib/docker/volumes(不同版本目录不一样)中就会创建一个目录绑定匿名卷
    .....

       以上为我实验的结果,记录一下备忘。

     

     

      参考链接:http://dockone.io/article/128

    展开全文
  • DockerfileVOLUME

    2021-05-15 17:23:36
    上面这段 Dockerfile 表示,在docker运行时,docker会在宿主机的 /var/lib/docker/volumes 创建一个匿名的 volume,所谓匿名,其实就是以一长串数字作为 volume 的名字,例如:2cde1b97f23d52af8c60e958c50b9b4a59c...

    FROM 基础镜像
    VOLUME /apps/data
    

    上面这段 Dockerfile 表示,在docker运行时,docker会在宿主机的 /var/lib/docker/volumes 创建一个匿名的 volume,所谓匿名,其实就是以一长串数字作为 volume 的名字,例如:2cde1b97f23d52af8c60e958c50b9b4a59c1007df7b34074030d5caeb51c2e72,并将此 volume 绑定到容器的 /apps/data 目录,如果容器的 /apps/data 目录下已经有内容,则会将内容拷贝到匿名 volume 中。也即,Dockerfile中的 VOLUME /apps/datadocker run -v /apps/data 镜像名 的效果一样。

    通过上面 Dockerfile 创建的镜像,每次运行得到一个新的容器时,都会为其在 /var/lib/docker/volumes 自动创建一个匿名的 volume,如果需要在不同 container 之间共享数据,那么我们依然需要通过 docker run -it -v volume_name:/apps/data 的方式将 /apps/data 中数据存放于指定的 volume_name 中,volume_name/var/lib/docker/volumes 中。

    展开全文
  • Dockerfile 指令 VOLUME 介绍

    千次阅读 2020-09-29 17:49:44
    通过dockerfileVOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都了挂载点。 还有一个区别是,通过VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。 #test FROM ...
  • 本篇文章主要介绍了浅谈docker Dockerfile 指令 VOLUME 介绍 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 013-Dockerfile-VOLUME

    千次阅读 2019-06-13 20:03:39
    语法 VOLUME ["/data"] ... 该值可以是 JSON 数组,VOLUME [“/var/log/”] 或具有多个参数的纯字符串,例如 VOLUME /var/log 或 VOLUME /var/log/var/db。 有关通过 Docker 客户端提供的更多信息/示例和...
  • #解释: #VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都了挂载点 #通过VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。 #举例: VOLUME ["/var/lib/tomcat7/webapps/...
  • dockerfilevolume指令怎么使用啊 [color=#FF0000]该问题来自CSDN Docker技术交流群(303806405),由版主xinshubiao整理。 [/color]
  • docker -v 和DockerfileVOLUME 区别

    千次阅读 2019-08-02 17:19:11
    DockerfileVOLUME ["/data/nginx","/usr/share/nginx"] docker run -v/data/nginx:/usr/share/nginx 如果只是读文件 两者都可以 如果是想把文件写出 两个也都可以 但是区别 volume 默认会写到/var/lib/...
  • Dockerfile 中的 VOLUME 与 docker -v 区别

    千次阅读 2020-07-08 11:37:59
    Dockerfile 中的 VOLUME 挂载目录方式与 docker -v 命令挂载目录方式,两者明显区别: 1、VOLUME DockerfileVOLUME 方式挂载到宿主机上的是匿名卷,在宿主机上是自动匿名挂载到 /var/lib/docker/volumes/ ...
  • 15.dockerfileVOLUME指令

    2019-09-24 13:12:37
    一、VOLUME指令说明 Docker镜像被存储在一系列的只读层。当我们开启一个容器,Docker读取只读镜像并添加一个读写层在顶部。如果正在运行的容器修改了现有的文件,该文件将被拷贝出底层的只读层到最顶层的读写层。...
  • Docker Volumedockerfile区别

    千次阅读 2019-07-04 17:18:13
    如果在dockerfile使用 VOLUME ["/docker/redis", "/config"] 上面的命令不是将本地的/docker/redis和docker的/config进行绑定,而是同时创建了两个挂载容器 在进行完docker build之后,可以通过docker inspect ...
  • 1.介绍 ...但是由于定义Dockerfile的时候,并不能保证在所有的宿主机上都这样的特定目录, 所以在Dockerfile定义中,只能指定容器卷目录; 2.编写DockerFile FROM centos VOLUME ["/home/v1",...
  • step1:编写DockerFile- FROM centos VOLUME ["/home/v1","/home/v2"] CMD /bin/bash step2:构建docker build -f myVolumeDockerFile -t java1234/myvolume:1.2 step3:运行docker run -it镜像ID step4:测试+docker...
  • Dockerfile

    2021-06-11 23:52:39
    Dockerfile Dockerfile 就是用来构建 docker 镜像的构建文件。命令脚本 通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都...[root@localhost docker-test-volume]# vim dockerfile1 FROM

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,743
精华内容 7,497
关键字:

dockerfilevolume有什么用