gpt4 book ai didi

docker - 当 exec docker 使用 "-v/path:/path"参数运行时,Dockerfile 中的文件丢失

转载 作者:行者123 更新时间:2023-12-02 21:06:27 26 4
gpt4 key购买 nike

我遇到了 的问题 docker 卷 .我要 mkdir目录和 touch 中的文件中Dockerfile .

当我执行 docker run -it --name any_name-v /path:/path image_name params,在Dockerfile中创建的目录和文件都丢失了。

例如:

用于构建镜像 BB:tag 的 Dockerfile。

FROM AA:tag

RUN set -ex \
&& mkdir -p /var/log/my_directory/ \
&& touch /var/log/my_directory/my_file.log

CMD ["anything_cmd"]

如果我执行
docker run -it --name any_name BB:tag

my_directory 和 my_file.log 都在那里。

但如果我执行
docker run -it --name any_name -v /var/log/container_logs/any_name:/var/log/ BB:tag

my_directory 和 my_file.log 都丢失了。
-v 发生了什么?当 docker run ?做这种事情的最佳做法是什么?

最佳答案

  • Dockerfile 中的步骤用于创建镜像。
  • docker run命令获取图像并创建一个容器。
  • 挂载卷(-v 参数)会将目录绑定(bind)到给定位置的容器中。并且主机挂载在该卷上没有任何初始化步骤。

  • 因此,预计只能看到来自 /var/log/container_logs/any_name 的文件。在容器内的主机上 /var/log/ .

    如果您需要初始化卷,有几个选项:
  • 您可以使用命名卷而不是主机卷。这将被初始化,但仅当该命名卷为空时。一旦命名卷中有文件,docker 将不会再次初始化它,因为这可能会导致数据丢失。
  • 您可以使用容器内的入口点脚本将文件从保存的位置复制到卷位置。图像中的这个保存位置不能被卷覆盖,否则您将遇到同样的问题。


  • 如果您想要一个指向主机目录的命名卷,您可以使用本地卷驱动程序(这是默认设置)和绑定(bind)挂载特定目录的选项。实现的各种方法包括:
      # create the volume in advance
    $ docker volume create --driver local \
    --opt type=none \
    --opt device=/home/user/test \
    --opt o=bind \
    test_vol

    # create on the fly with --mount
    $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
    foo

    # inside a docker-compose file
    ...
    volumes:
    bind-test:
    driver: local
    driver_opts:
    type: none
    o: bind
    device: /home/user/test
    ...

    如果您想使用入口点脚本,请参阅 my base image repo 中的卷缓存说明。 .

    关于docker - 当 exec docker 使用 "-v/path:/path"参数运行时,Dockerfile 中的文件丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57697376/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com