【问题标题】:Dockerfile, persist data with VOLUMEDockerfile,使用 VOLUME 持久化数据
【发布时间】:2016-09-04 13:58:11
【问题描述】:

在我了解 docker 的过程中,请多多包涵。我正在使用v1.11.1

我正在制作一个 Dockerfile,并希望指定容器的一个文件夹应该被持久化,这应该只对每个用户(运行容器的计算机)进行持久化。我原本以为包括:

VOLUME /path/to/dir/to/persist

就足够了,但是当我使用docker run -t -i myimage:latest bash 启动我的容器并手动添加文件时,exit 我希望能够再次找到我的文件。但是当我再次运行图像时(如上所述),添加的文件不再存在。

我已经阅读过,但在使用 VOLUMES 方面的答案似乎已经过时,或者提出了我不想做的事情,即:

  • 我不想在运行命令中使用-v
  • 我宁愿不制作卷容器(对于我的一个小文件夹来说似乎有点过分了)

我做错了什么?任何帮助将不胜感激。

大家好。

更新:我可以使用命名卷保存数据,即:docker run -v name:/path/to/persist -t -i myimage:latest bash 但是使用包含 VOLUME name:/path/to/persist 的 Dockerfile 构建不起作用。

【问题讨论】:

    标签: docker dockerfile docker-volume


    【解决方案1】:

    不太明显的是,每次执行“docker run”时,您都在创建一个全新的容器。然后每个新容器都会有一个新的卷。

    所以你的数据被持久化了,但你没有从你写入的容器中读取数据。

    举例说明问题

    示例 Dockerfile

    FROM ubuntu
    VOLUME /data
    

    正常构建

    $ docker build . -t myimage
    Sending build context to Docker daemon 2.048 kB
    Step 1 : FROM ubuntu
     ---> bd3d4369aebc
    Step 2 : VOLUME /data
     ---> Running in db84d80841de
     ---> 7c94335543b8
    

    现在运行两次

    $ docker run -ti myimage echo hello world
    $ docker run -ti myimage echo hello world
    

    看看卷

    $ docker volume ls
    DRIVER              VOLUME NAME
    local               078820609d31f814cd5704cf419c3f579af30672411c476c4972a4aad3a3916c
    local               cad0604d02467a02f2148a77992b1429bb655dba8137351d392b77a25f30192b
    

    “docker rm”命令有一个特殊的“-v”选项,可以清理与容器相关的所有卷。

    $ docker rm -v $(docker ps -qa)
    

    如何使用数据容器

    使用上一个示例中构建的相同 docker 映像创建一个容器,其唯一目的是通过其卷保存数据

    $ docker create --name mydata myimage
    

    启动另一个容器,将一些数据保存到“/data”卷中

    $ docker run -it --rm --volumes-from mydata myimage bash
    root@a1227abdc212:/# echo hello world > /data/helloworld.txt
    root@a1227abdc212:/# exit
    

    启动第二个容器来检索数据

    $ docker run -it --rm --volumes-from mydata myimage cat /data/helloworld.txt
    hello world
    

    清理,只需删除容器并指定“-v”选项以确保清理其卷。

    $ docker rm -v mydata
    

    注意事项:

    • “volumes-from”参数表示所有数据都保存到与“mydata”容器关联的基础卷中
    • 运行容器时,“rm”选项将确保它们被自动删除,这对于一次性容器很有用。

    【讨论】:

    • 感谢您提供的所有信息。但是为什么我可以从命令行成功使用命名卷,但不能从 Dockerfile 中使用呢?这就是我感到困惑的地方(见我的更新)。官方文档还说我们不应该再使用卷容器,所以它更加混乱。
    • @D.Mill 命名卷是数据管理的另一种选择,如果您将其与新的存储插件结合使用,效果最佳。在这里,我专注于您的问题,即支持在 Dockerfile 中声明的卷,并解释为什么它没有按您的预期工作。总之,您无法将卷映射到本地存储(命名或其他方式)的原因是因为 Docker 文件在构建时使用,而不是在运行时使用。 Dockerfiles 构建镜像,镜像用于创建容器。只有在运行容器时,您才知道要将存储指向哪里。
    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多