如何保留Docker容器卷文件?

7
我希望将 ~/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
1个回答

17
当您在docker运行时添加一个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

......


4
这个问题有没有文档记录?除非我眼瞎,否则我在v2或v3的文档中没找到。也许这只是标准的Docker语法? - infogulch
3
我得到了“无法为服务SERVICE创建容器:无法在现有文件上挂载卷,文件已存在CONTAINER_FILE_PATH”的错误信息,这种方法仍然有效吗?还是只适用于版本2?我运行的是3.5版本。 - Ixio
docker-compose只是将yaml文件转换为docker命令,没有什么花哨的东西。如果在docker中可以运行,那么在compose中也可以运行。就您的观点而言,我跑了一个快速的 docker run -it --rm -v pwd/conf/server.conf:/etc/nginx/nginx.conf nginx,并且如预期地将该文件挂载到了nginx配置文件上。如果它没有工作,您应该开一个新问题。 - Paul Becotte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接