如何保留Docker容器卷文件?

问题描述 投票:4回答:1

我想与主机共享~/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个回答
9
投票

当您在docker run中添加VOLUME时,您所说的是使用主要主机文件系统而不是Docker用于映像的copy-on-write文件系统。这里有两个主要选项:

  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

......

© www.soinside.com 2019 - 2024. All rights reserved.