首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保存Docker容器卷文件?

如何保存Docker容器卷文件?
EN

Stack Overflow用户
提问于 2016-11-08 15:47:06
回答 1查看 10.9K关注 0票数 7

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

代码语言:javascript
复制
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

代码语言:javascript
复制
#/bin/bash
FROM php:5.6

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

VOLUME /root/mydir

目录/srv/mono/mydir为空。它被主机目录所取代。清楚了。

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

例如,它适用于MySQL Percona容器:

代码语言:javascript
复制
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'

容器中有原始文件:

代码语言:javascript
复制
$ ll /srv/mysql/percona-56
total 176220
    auto.cnf
    error.log
    ibdata1
    ib_logfile0
    ib_logfile1
    init.ok
    mysql
    performance_schema

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

代码语言:javascript
复制
$ docker --version
Docker version 1.12.3, build 6b644ec
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-08 16:20:12

当您在docker运行时添加卷时,您要说的是使用主主机文件系统,而不是Docker用于图像的复制即写文件系统。这里有两个主要选择:

  1. 将一个实际的文件系统位置绑定到映像中。这就是你在这里做的。
  2. 你让码头处理地点..。在本例中,Docker在主文件系统上创建位置,然后将映像的内容复制到该位置,以便开始工作。

您希望两者都得到-您希望在您的文件系统上的一个固定位置,但您希望文件从您的图像在那里。现在,它不能这样工作是有原因的!如果'auto.conf‘已经存在于该文件夹中,并且启动容器,会发生什么情况?如果运行两个容器,文件的不同版本指向同一个位置,会发生什么情况?这就是为什么如果您选择一个真正的位置,它不会试图猜测如何处理图像和文件系统之间的冲突,它只是与文件系统一起使用。

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

代码语言:javascript
复制
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

.

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40491036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档