精华内容
下载资源
问答
  • dockerfile volume
    2022-01-21 18:27:11

    dockerfile指令VOLUME

    VOLUME

    ​ 定义***匿名***数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

    作用

    • 避免重要的数据,因容器重启而丢失。
    • 避免容器不断变大。
    • 在开发时,便于开发和调试

    格式

    # 第一种
    VOLUME ["/data", "/data/home"...]
    # 第二种
    VOLUME /data /data/home
    # 第三种 json
    VOLUME ["/data/log/"]
    

    VOLUME注意事项官网说明!!!

    • 基于 Windows 的容器上的卷:使用基于 Windows 的容器时,容器内卷的目标必须是以下之一:
      • 一个不存在或空的目录
      • 以外的驱动器 C:
    • 从 Dockerfile 中更改卷:如果任何构建步骤在声明卷后更改了卷中的数据,则这些更改将被丢弃。
    • JSON 格式:列表被解析为 JSON 数组。您必须用双引号 ( ") 而不是单引号 ( ') 将单词括起来。
    • 主机目录在容器运行时声明:主机目录(挂载点)本质上是依赖于主机的。这是为了保持图像的可移植性,因为不能保证给定的主机目录在所有主机上都可用。因此,您无法从 Dockerfile 中挂载主机目录。该VOLUME指令不支持指定host-dir 参数。您必须在创建或运行容器时指定挂载点。

    注意:dockerfile定义的volume无法指定挂在主机(宿主机)目录,如果需要指定挂载主机目录,需要在docker run的时候指定宿主机目录

    更多相关内容
  • dockerfile volume

    2022-06-27 08:34:21
    dockerfile volume 机制

    Volume

    https://www.cnblogs.com/51kata/p/5266626.html

    前言

    在介绍VOLUME指令之前,我们来看下如下场景需求:

    1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上。一旦容器删除后,这些数据就没了,除非我们人工备份下来(或者基于容器创建新的镜像)。能否可以让容器进程持久化的数据保存在主机上呢?这样即使容器删除了,数据还在。

    2)当我们在开发一个web应用时,开发环境是在主机本地,但运行测试环境是放在docker容器上。

    这样的话,我在主机上修改文件(如html,js等)后,需要再同步到容器中。这显然比较麻烦。

    3)多个容器运行一组相关联的服务,如果他们要共享一些数据怎么办?

    对于这些问题,我们当然能想到各种解决方案。而docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来,容器上的挂载点下的内容就是主机的这个目录下的内容,这类似linux系统下mount的机制。 这样的话,我们修改主机上该目录的内容时,不需要同步容器,对容器来说是立即生效的。 挂载点可以让多个容器共享。

    具体的机制。

    一、通过docker run命令

    1、运行命令:docker run --name test -it -v /home/xqh/myimage:/data ubuntu /bin/bash

    其中的 -v 标记 在容器中设置了一个挂载点 /data(就是容器中的一个目录),并将主机上的 /home/xqh/myimage 目录中的内容关联到 /data下。

    这样在容器中对/data目录下的操作,还是在主机上对/home/xqh/myimage的操作,都是完全实时同步的,因为这两个目录实际都是指向主机目录。

    2、运行命令:docker run --name test1 -it -v /data ubuntu /bin/bash

    上面-v的标记只设置了容器的挂载点,并没有指定关联的主机目录。这时docker会自动绑定主机上的一个目录。通过docker inspect 命令可以查看到。

    xqh@ubuntu:~/myimage$ docker inspect test1
    [
    {
        "Id": "1fd6c2c4bc545163d8c5c5b02d60052ea41900a781a82c20a8f02059cb82c30c",
    .............................
        "Mounts": [
            {
                "Name": "0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01",
                "Source": "/var/lib/docker/volumes/0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true
            }
        ],
    

    上面 Mounts下的每条信息记录了容器上一个挂载点的信息,“Destination” 值是容器的挂载点,"Source"值是对应的主机目录。

    可以看出这种方式对应的主机目录是自动创建的,其目的不是让在主机上修改,而是让多个容器共享。

    二、通过dockerfile创建挂载点

    上面介绍的通过docker run命令的-v标识创建的挂载点只能对创建的容器有效。

    通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。

    还有一个区别是,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

    #test
    FROM ubuntu
    MAINTAINER hello1
    VOLUME [“/data1”,“/data2”]
    上面的dockfile文件通过VOLUME指令指定了两个挂载点 /data1 和 /data2.

    我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息

        "Mounts": [
            {
                "Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21",
                "Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data",
                "Destination": "/data1",
                "Driver": "local",
                "Mode": "",
                "RW": true
            },
            {
                "Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36",
                "Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data",
                "Destination": "/data2",
                "Driver": "local",
                "Mode": "",
                "RW": true
            }
        ],
    

    可以看到两个挂载点的信息。

    三、容器共享卷(挂载点)

    docker run --name test1 -it myimage /bin/bash

    上面命令中的 myimage是用前面的dockerfile文件构建的镜像。 这样容器test1就有了 /data1 和 /data2两个挂载点。

    下面我们创建另一个容器可以和test1共享 /data1 和 /data2卷 ,这是在 docker run中使用 --volumes-from标记,如:

    可以是来源不同镜像,如:

    docker run --name test2 -it --volumes-from test1 ubuntu /bin/bash

    也可以是同一镜像,如:

    docker run --name test3 -it --volumes-from test1 myimage /bin/bash

    上面的三个容器 test1 , test2 , test3 均有 /data1 和 /data2 两个目录,且目录中内容是共享的,任何一个容器修改了内容,别的容器都能获取到。

    四、最佳实践:数据容器

    如果多个容器需要共享数据(如持久化数据库、配置文件或者数据文件等),可以考虑创建一个特定的数据容器,该容器有1个或多个卷。

    其它容器通过–volumes-from 来共享这个数据容器的卷。

    因为容器的卷本质上对应主机上的目录,所以这个数据容器也不需要启动。

    如: docker run --name dbdata myimage echo “data container”

    说明:有个卷,容器之间的数据共享比较方便,但也有很多问题需要解决,如权限控制、数据的备份、卷的删除等。这些内容后续文章介绍。

    展开全文
  • dockerfile volume 添加多个卷踩坑

    千次阅读 2022-01-28 17:54:31
    dockerfile 在使用volume添加多个卷时分隔符直接’,'不能加空格 例如: VOLUME ['/web/xxx/conf','/web/xxx/log'] 不能是: VOLUME ['/web/xxx/conf', '/web/xxx/log'] 多加的空格会导致卷目录下出现名称为 “]” ...

    dockerfile 在使用volume添加多个卷时分隔符直接’,'不能加空格
    例如:

    VOLUME ['/web/xxx/conf','/web/xxx/log']
    

    不能是:

    VOLUME ['/web/xxx/conf', '/web/xxx/log']
    

    多加的空格会导致卷目录下出现名称为 “]” 的文件夹(或者是其他名称奇怪的文件夹)

    当使用单引号(’)而不是双引号(")将卷包含起来时,docker run -v /web/xxx:/web/xxx --name test image-name:image-tag 会将宿主机目录的/web/xxx映射到容器的/web/xxx
    当使用是双引号(")而不是单引号(’)将卷包含起来时,例如:

    VOLUME ["/web/xxx/conf","/web/xxx/log"]
    

    docker run -v /web/xxx:/web/xxx --name test image-name:image-tag 不会将宿主机目录的/web/xxx映射到容器的/web/xxx,docker会在宿主机创建新的匿名卷(通常是docker程序存放匿名卷数据的位置),并将该匿名卷映射到容器的/web/xxx,例如:

    {
                    "Type": "volume",
                    "Name": "7742d4a4d499e2ea0ef0c76ee727ee36ba810ff5177facd5988e8f4650e15662",
                    "Source": "/var/lib/docker/volumes/7742d4a4d499e2ea0ef0c76ee727ee36ba810ff5177facd5988e8f4650e15662/_data",
                    "Destination": "/web/xxx/conf",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
    },
    
    展开全文
  • 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 测试

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

    2021-05-15 17:23:36
    上面这段 Dockerfile 表示,在docker运行时,docker会在宿主机的 /var/lib/docker/volumes 创建一个匿名的 volume,所谓匿名,其实就是以一长串数字作为 volume 的名字,例如:2cde1b97f23d52af8c60e958c50b9b4a59c...
  • 本篇文章主要介绍了浅谈docker Dockerfile 指令 VOLUME 介绍 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Dockerfile 指令 VOLUME 介绍

    千次阅读 2021-08-24 21:47:52
    Dockerfile 指令 VOLUME 介绍 前言一、容器上不了网的问题的解决方法:1.启动容器限制容器可以使用的cpu和内存资源**2.问题:如何限制一个进程可以使用多少cpu和多少内存?3.docker 容器起的mysql,可以使用root用户...
  • 相信大部分人对docker run -v这个...但如果玩过dockerfile的话就知道dockerfile还有个VOLUME指令,如 这个指令很容易和启动时的-v指令搞混淆,他们之间到底有什么区别呢,什么时候需要使用volume呢? volume指令指定的
  • VOLUME 一句话总结 作用:创建一个匿名数据卷挂载点 格式:VOLUME ["/data"] 详解:运行容器时可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保持的数据等 实际栗子 VOLUME ["/data"] 这里的/...
  •   · 运行镜像和dockerfile中使用RUN、CMD和ENTRYPOINT指令指定时,USER指令用于设置用户名(或UID),可选的设置用户组(或GID)。   · 当为用户指定组时,用户将只有指定的组成员资格。任何其他配置的组成员...
  • Dockerfile Volume指令与docker -v的区别

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

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

    千次阅读 2020-07-08 11:37:59
    Dockerfile 中的 VOLUME 挂载目录方式与 docker -v 命令挂载目录方式,两者有明显区别: 1、VOLUME DockerfileVOLUME 方式挂载到宿主机上的是匿名卷,在宿主机上是自动匿名挂载到 /var/lib/docker/volumes/ ...
  • 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...
  • VOLUME['/home/v1','/home/v2'] 说明:前面用启动命令 -v 宿主机目录:容器卷目录 来实现容器卷目录挂载 但是由于定义Dockerfile的时候,并不能保证在所有的宿主机上都有这样的特定目录, 所以在Dockerfile定义中,...
  • 初识Dockerfile Dockerfile是构建镜像用的,是一个命令脚本 方式一(commit) 方式二(Dockerfile) 操作步骤 新建一个命令脚本文件放在指定地方例如:/home/docker-test-volume 脚本起名就叫dockerfile01...
  • DockerFile是什么? Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。...#volume test FROM centos ...
  • Dockerfile 中的 VOLUME 挂载与 docker -v 命令挂载,两者有明显区别: 1、VOLUME DockerfileVOLUME 方式挂载到宿主机上的是匿名卷,在宿主机上是自动匿名挂载到 /var/lib/docker/volumes/ 目录下的,代码如下: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,078
精华内容 10,831
关键字:

dockerfile volume