【问题标题】:Why do files disappear when folder is mapped为什么映射文件夹时文件消失
【发布时间】:2021-10-06 18:07:56
【问题描述】:

我有下面的 Dockerfile 文件:


FROM ubuntu:focal
LABEL maintainer="campos <joledal387@ncstorms.com>"

# Update the system and install the necessary packages
RUN apt update && apt -y install nano

# Create directory
RUN mkdir /testdir
RUN touch /testdir/file.txt
RUN chmod 777 /testdir/file.txt
VOLUME ["/testdir/"]

# Copy the message "Hello World!"
COPY hello.txt /testdir/file.txt

CMD /bin/bash

我从 Dockerfile 创建映像:

docker build -t imgtest .

然后我创建了三个容器。在第一个示例中,当我进入容器时,可以看到/testdir 中的file.txt 文件。在第二个示例中,当映射卷/data /test:/testdir 时,我看不到 file.txt 文件。第三个例子,映射/data /var:/var时,看不到文件夹里的文件。

示例 1:

docker run -d -it --name cont-test-01 --hostname cont-test-01 --restart=always imgtest

docker exec -it cont-test-01 /bin/bash

示例 2:

docker run -d -it --name cont-test-02 --hostname cont-test-02 --restart=always -v /data/test:/testdir imgtest

docker exec -it cont-test-02 /bin/bash

示例 3:

docker run -d -it --name cont-test-03 --hostname cont-test-03 --restart=always -v /data/var:/var imgtest

docker exec -it cont-test-03 /bin/bash

如何更改 Dockerfile,以便我创建的卷和系统文件夹(如 /var)中的文件出现在 docker 主机的容器和映射文件夹中?

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

    在第一个例子中,当我进入容器时,我可以在/testdir中看到file.txt文件

    所以第一个示例似乎完全按照您的预期工作。

    第二个例子,在映射卷/data /test:/testdir时,看不到file.txt文件。

    那是因为您正在覆盖文件夹:

    $ docker run -d -it --name cont-test-02 --hostname cont-test-02 --restart=always -v /data/test:/testdir imgtest
    

    通过执行-v /data/test:/testdir,您将主机上/data/test 下的所有内容挂载到容器/testdir,有效地删除了之前/testdir 中的所有内容。当使用 -v /data/test:/testdir2 之类的东西时,您可以同时在容器中访问 /testdir/testdir2

    在第三个例子中,映射/data /var:/var时,看不到文件夹中的文件。

    您指的是哪个文件夹中的哪些文件? 正如上面使用-v /data/var:/var 解释的那样,您正在安装从主机/data/var 到容器/var 的所有内容。如果您在容器/var 中看不到任何文件,那么您很可能在主机上的/data/var 中没有任何文件。 在您的主机上执行以下命令,您应该会在容器 /var 文件夹中看到一个名为 bar.txt 的文件:

    mkdir -p /data/var/
    echo "foo" > bar.txt
    docker run -d -it --name cont-test-03 --hostname cont-test-03 --restart=always -v /data/var:/var imgtest
    

    【讨论】:

      【解决方案2】:

      正如@F1ki 所说,如果您使用默认音量功能-v /source:/target,目标的内容将被替换为/source。您的容器在 /target 启动后创建的新文件将在您的 /source 文件夹中可用

      但如果您的目标是将容器的现有文件和新文件放在主机上的文件夹中,则可以使用更高级的卷功能:

      卷创建(config_vol)

      docker volume create --driver local \
          --opt type=none \
          --opt device=/data/test \
          --opt o=bind \
          config_vol
      

      使用创建的卷

      docker run -it --name cont-test-04 -v config_vol:/testdir imgtest
      

      之后,您可以在主机文件夹 /data/test

      中看到您的 file.txt

      我使用/var 进行了测试,并且能够在我的主机目录中获取其所有文件夹/文件:

      提示和文档

      【讨论】:

      • 我做了上面的测试,它工作正常。使用命令docker volume ls 创建容器后,我可以看到卷config_vol。但是在一些互联网示例中,当 docker 主机文件夹和容器文件夹映射时,不需要创建卷。在这种情况下,docker volume ls 什么也不返回。
      • 发生这种情况的示例:docker run -d --name=cont-db-01 --hostname=cont-db-01 \ -v /data/db/mysql:/var/lib/mysql \ --network=db-network \ -e MYSQL_ROOT_PASSWORD=root_password \ -e MYSQL_DATABASE=mydatabase \ -e MYSQL_USER=myuser \ -e MYSQL_PASSWORD=myuser_password \ mysql:5.7
      • 我希望将/testdir/var 挂载到docker 主机上,它们的所有内容都类似于上面的示例。示例映射的工作原理对我来说是个谜。我可以在/data/db/mysql 中看到所有内容。
      • 当我将config_vol 删除为docker volume rm config_vol 时,/data/test 文件夹被保留。有没有办法通过 docker cli 删除卷和与之关联的文件夹?
      猜你喜欢
      • 1970-01-01
      • 2019-10-19
      • 2019-08-07
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2013-09-16
      • 2015-09-30
      • 1970-01-01
      相关资源
      最近更新 更多