2016-11-08 62 views
2

我想與主機共享~/mydir目錄,但不能將Docker容器目錄替換爲主機文件。 所以,我有docker-compose.yml如何保留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' 
    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是空的。它被主機目錄取代。很明顯。

但如何保留原始文件?從容器

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,但沒有找到相關

例如,它針對MySQL的Percona集裝箱工作分享量。

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

回答

3

當你在泊塢窗運行添加捲,什麼你說的是使用主主機文件系統而不是泊塢窗使用的圖像寫入時複製文件系統。這裏有兩個主要選項:

  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 

......