2016-07-15 135 views
2

在我Ubuntu EC2我的主機使用Docker容器的應用程序。 db數據和upload數據被存儲在正被此創建的卷CaseBook-data-dbCaseBook-data-uploads命令:泊塢窗:改變文件夾中存儲泊塢窗卷

docker volume create --name=CaseBook-data-db 
docker volume create --name=CaseBook-data-uploads 
正在通過 docker-compose文件附

卷:

version: '2' 
services: 
    mongo: 
     container_name: "CaseBook-db" 
     restart: always 
     image: mongo:3.2.7 
     ports: 
      - "27017" 
     volumes: 
      - data_db:/data/db 
     labels: 
      - "ENVIRONMENT_TYPE=meteor" 

    app: 
     container_name: "CaseBook-app" 
     restart: always 
     image: "meteor/casebook" 
     build: . 
     depends_on: 
      - mongo 
     environment: 
      - MONGO_URL=mongodb://mongo:27017/CaseBook 
     ports: 
      - "80:3000" 
     volumes: 
      - data_uploads:/Meteor-CaseBook-Container/.uploads 
     labels: 
      - "ENVIRONMENT_TYPE=meteor" 
volumes: 
    data_db: 
     external: 
      name: CaseBook-data-db 
    data_uploads: 
     external: 
      name: CaseBook-data-uploads 

我需要存儲那些搬運工卷主機的不同文件夾(例如/home/ubuntu/data/)。如何更改容器的碼頭存儲文件夾?或者有更好的方法來做到這一點?先謝謝你。

回答

-1

使用本地堅持碼頭附加組件幫助我解決了這個問題。感謝BMitch的回答。

7

命名卷將被儲存碼頭工人的文件夾(在/ var/lib中/泊塢窗)內。如果你想創建一個特定的主機文件夾的卷,使用主機體積的語法如下:

docker run -v /home/ubuntu/data/app-data:/app-data my-image 

或者從您撰寫的文件:

version: '2' 
services: 
    mongo: 
     container_name: "CaseBook-db" 
     restart: always 
     image: mongo:3.2.7 
     ports: 
      - "27017" 
     volumes: 
      - /home/ubuntu/data/db:/data/db 
     labels: 
      - "ENVIRONMENT_TYPE=meteor" 

    app: 
     container_name: "CaseBook-app" 
     restart: always 
     image: "meteor/casebook" 
     build: . 
     depends_on: 
      - mongo 
     environment: 
      - MONGO_URL=mongodb://mongo:27017/CaseBook 
     ports: 
      - "80:3000" 
     volumes: 
      - /home/ubuntu/data/uploads:/Meteor-CaseBook-Container/.uploads 
     labels: 
      - "ENVIRONMENT_TYPE=meteor" 

隨着主機卷,的任何內容圖像內的卷將與主機文件夾的確切內容(包括主機文件夾的UID)重疊。空的主機文件夾不是以空名稱卷的方式從映像初始化的。 UID映射往往是使用主機卷最困難的部分。


編輯:從下面的評論,如果你需要一個名爲卷充當主機的體積,有可能對docker's plugin list上市local persist volume plugin。安裝插件後,您可以創建指向主機文件夾的卷,即使在刪除指定的卷之後,主機目錄也會留下。從插件使用範例包括:

docker volume create -d local-persist -o mountpoint=/data/images --name=images 
docker run -d -v images:/path/to/images/on/one/ one 
docker run -d -v images:/path/to/images/on/two/ two 

,還包括與下列音量例如V2撰寫文件:

volumes: 
    data: 
    driver: local-persist 
    driver_opts: 
     mountpoint: /data/local-persist/data 

,我已經在已取得的認識的一個附加選項過去的一個月是使用本地卷驅動程序的掛載選項來手動創建綁定掛載。這類似於搬運工主機卷有以下區別:

  • 如果該目錄不存在,試圖啓動一個容器名爲量指着一個綁定安裝會失敗。通過主機卷,docker會將其初始化爲root所擁有的空目錄。
  • 如果目錄爲空,則一個已命名的卷將使用掛載位置處的映像內容(包括文件和目錄所有權/權限)初始化綁定掛載。使用主機卷時,不會初始化主機目錄內容。

要創建一個名爲卷作爲綁定安裝,可以提前與創建它:

docker volume create --driver local \ 
    --opt type=none \ 
    --opt device=/home/user/test \ 
    --opt o=bind \ 
    test_vol 

docker run命令,這可以用--mount做到:

docker run -it --rm \ 
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \ 
    foo 

或者在撰寫文件中,您可以創建指定卷:

volumes: 
    data: 
    driver: local 
    driver_opts: 
     type: none 
     o: bind 
     device: /home/user/test 

如果您需要命名的卷功能,我的首選是使用帶有本地驅動程序的命名卷,而不是本地持久性第三方驅動程序。

+0

但有沒有辦法使用命名卷,但具有相同的邏輯? – DimonVersace

+1

不適用於默認的命名卷,至少不是我所知。您可以添加其他音量驅動程序,例如[local persist](https://github.com/CWSpear/local-persist),以支持此功能。 – BMitch

+1

這實際上幫助我,節省了我的時間。謝謝! – DimonVersace

0

內建驅動當地另一種方式:

docker volume create --opt type=none --opt device=/home/ubuntu/data/ --opt o=bind data_db 

(此使用DimonVersace例如有:data_db聲明爲碼頭工人,撰寫和/家庭/ Ubuntu的外部命名爲音量/數據/作爲主機上的文件夾)