【问题标题】:How to keep Docker container volume files?如何保存 Docker 容器卷文件?
【发布时间】:2017-03-22 07:44:51
【问题描述】:

我想与主机共享~/mydir 目录,但不想用主机文件替换 Docker 容器目录。 所以,我有docker-compose.yml

version: '2'
services:
  app:
    container_name: mono
    build: .
    volumes:
      # save .composer files on host to keep cache warmed up
      - '/srv/mono/mydir:/root/mydir'
    command: sleep infinity

还有Dockerfile

#/bin/bash
FROM php:5.6

RUN mkdir /root/mydir && echo '{}' > /root/mydir/myfile.json

VOLUME /root/mydir

目录/srv/mono/mydir 为空。它被替换为主机目录。很清楚。

但是如何保留原始文件呢?

例如它适用于 MySQL Percona 容器:

version: '2'
services:
  percona-56:
    container_name: percona-56
    image: percona/percona-server:5.6
    volumes:
    - /srv/mysql/percona-56:/var/lib/mysql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'

容器中有原始文件:

$ ll /srv/mysql/percona-56
total 176220
    auto.cnf
    error.log
    ibdata1
    ib_logfile0
    ib_logfile1
    init.ok
    mysql
    performance_schema

我尝试检查Percona Dockerfile,但没有找到与卷共享相关的内容。

$ docker --version
Docker version 1.12.3, build 6b644ec

【问题讨论】:

    标签: docker docker-compose dockerfile docker-volume


    【解决方案1】:

    当您在 docker run 中添加 VOLUME 时,您的意思是使用主主机文件系统,而不是 Docker 用于映像的写时复制文件系统。这里有两个主要选项:

    1. 您将一个实际的文件系统位置绑定挂载到映像中。这就是你在这里所做的。
    2. 您让 Docker 处理该位置...在这种情况下,Docker 在主文件系统上创建该位置,然后将映像的内容复制到该位置以开始工作。

    您希望两者兼得——您希望文件系统上有一个固定位置,但您希望图像中的文件在那里。现在,它不能以这种方式工作是有原因的!如果该文件夹中已经存在“auto.conf”并且您启动了容器,会发生什么?如果您运行两个具有指向同一位置的不同版本文件的容器会发生什么?这就是为什么如果你选择一个真实的位置,它不会试图猜测如何处理图像和文件系统之间的冲突,它只是与文件系统有关。

    你可以实现你想要的。真的有两种选择。更好的方法是让您的应用程序从两个单独的文件夹中读取 - 一个填充在图像中,一个位于您的文件系统上。这完全避免了这个问题;)第二个选项是进入并告诉 Docker 如何处理映像中的单个文件。

    version: '2'
    services:
      app:
        container_name: mono
        build: .
        volumes:
          # save .composer files on host to keep cache warmed up
          - '/srv/mono/mydir:/root/mydir'
          # Marking a volume this way will tell Docker to use THIS file 
          # from the image, even though the parent directory is a regular
          # volume.  If you have an auto.cnf file in your directory, it
          # will be ignored. 
          - /root/mydir/auto.cnf
        command: sleep infinity
    

    ......

    【讨论】:

    • 这只是.... 没有记录在任何地方吗?除非我是盲人,否则我在 v2 或 v3 文档上看不到它。也许这只是标准的 docker 语法?
    • 我收到Cannot create container for service SERVICE: cannot mount volume over existing file, file exists CONTAINER_FILE_PATH,这个方法仍然有效还是仅适用于版本 2?我在 3.5。
    • docker-compose 只是将 yaml 翻译成 docker 命令,没什么特别的。如果它在 docker 中工作,它在 compose 中工作。关于你的观点,只是为了确保我跑得很快docker run -it --rm -v pwd/conf/server.conf:/etc/nginx/nginx.conf nginx,并且正如预期的那样,它将该文件安装在 nginx 配置文件上。如果它不起作用,您应该打开一个新问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2017-09-06
    • 2019-08-06
    • 2020-11-20
    相关资源
    最近更新 更多