2016-02-25 72 views
7

我意識到其他人也有類似的問題,但這使用v2撰寫文件格式,我沒有找到任何的東西。如何使卷永久與Docker撰寫v2

我想製作一個非常簡單的測試應用程序,以便與MemSQL一起玩,但我無法獲取卷在docker-compose down之後不會被刪除。如果我已經正確理解Docker Docs,則不應刪除未明確告知的卷。一切似乎與docker-compose up一起工作,但下去後,然後再次從數據庫中刪除所有數據。

按照推薦的做法,我使用單獨的memsqldata服務作爲單獨的數據層。

這裏是我的搬運工,compose.yml:

version: '2' 
services: 
    app: 
     build: . 
     links: 
      - memsql 
    memsql: 
     image: memsql/quickstart 
     volumes_from: 
      - memsqldata 
     ports: 
      - "3306:3306" 
      - "9000:9000" 
    memsqldata: 
     image: memsql/quickstart 
     command: /bin/true 
     volumes: 
      - memsqldatavolume:/data 

volumes: 
    memsqldatavolume: 
     driver: local 
+1

我會嘗試沒有memsqldata容器。由於您正在使用命名卷,因此不需要數據卷容器。我嘗試了'down',並且默認情況下它不會刪除任何卷。 – dnephin

+0

有可能mysql數據根本不在音量中?我不認爲它通常使用'/ data'。 – dnephin

回答

4

這可以追溯到MemSQL的糟糕文檔。 MemSQL在memsql/quickstart容器中的數據路徑是/memsql而不是/var/lib/memsql就像在獨立安裝(和MemSQL文檔中)一樣,絕對不是像有人告訴我的/data

1

您正在使用docker-compose down,如果你看一下文檔here

停止容器和容器中刪除,網絡容量和圖像 由up創建。默認情況下,只有容器和網絡被刪除。

你是對的,它不應該刪除卷(默認情況下)。這可能是一個錯誤,或者您可能已經更改了默認配置。但我認爲你的正確命令是docker-compose stop。我會嘗試使用down命令進行一些簡單的測試。

+0

我使用默認配置中的所有內容。我不是Docker專家,所以我希望有明智的默認選擇;)昨天安裝了Toolbox,所以一切應該在最新版本:docker-compose 1.6.0版,build d99cad6,docker-py版本:1.7.0。 – jimmy

+0

您是否已經嘗試建立並單獨運行「memsqldata」,在卷中提供一些文件,然後停止/刪除容器並查看是否還有文件? –

+0

是的。我一直在測試相同的memsql結構幾天。我只是測試了它的工作原理,如果我做碼頭停車。這是'下來',似乎不是它所想的那樣行事。 – jimmy

2

不知道這是否有幫助。當您使用docker-compose up -d下載容器並創建圖像時。要停止泊塢窗圖像,使用docker-compose down,並且圖像將保留並可以重新啓動docker-compose start

我正在使用up/down命令並一直保持丟失數據,直到我嘗試停止/啓動並且現在數據持續存在。

+0

經過幾個小時的搜索,解決了我的問題! – mattsch

+0

這是錯誤的。 'docker-compose down'刪除卷。我認爲這就是鮑比想要說的。 –

+2

停止/啓動將保留相同的容器,如果您丟失/停止數據,則不會將數據存儲在卷中,而是將數據存儲在容器本身中,而不應將其視爲持久存儲。 'docker-compose down'不會刪除卷,除非你也包含'-v'選項。 – BMitch

1

最簡單的解決方案是使用docker-compose stop而不是docker-compose down。然後docker-compose start重啓。

根據docs,down「停止容器並移除由up創建的容器,網絡,卷和圖像」。

+1

'docker-compose down'不會刪除卷,除非您通過'-v'選項。 – BMitch

+0

這不是我所看到的,用[docker-compose.yml](https://github.com/jstray/cjworkbench-docker/blob/master/docker-compose.yml)文件。即使沒有'-v',Down也會刪除音量。如果有什麼我做錯了,我很想知道!我生活在意外失去數據庫的恐懼之中。 –

+0

這可能是值得作爲一個單獨的問題與所有的細節問題,而不是試圖在評論中調試。 – BMitch

8

我意識到這是一箇舊的和解決的線程,OP指向容器中的目錄而不是他們已經安裝的目錄,但是想要清除一些我所看到的錯誤信息。

docker-compose down不會刪除卷,如果您還想刪除卷,則需要運行docker-compose down -v。這裏的幫助文本直接從泊塢窗 - 撰寫(注意是「默認」列表):

$ docker-compose down --help 
Stops containers and removes containers, networks, volumes, and images 
created by `up`. 

By default, the only things removed are: 

- Containers for services defined in the Compose file 
- Networks defined in the `networks` section of the Compose file 
- The default network, if one is used 

Networks and volumes defined as `external` are never removed. 

Usage: down [options] 

Options: 
... 
    -v, --volumes  Remove named volumes declared in the `volumes` section 
         of the Compose file and anonymous volumes 
         attached to containers. 
... 

$ docker-compose --version 
docker-compose version 1.12.0, build b31ff33 

這裏與一個名爲量測試和虛擬指令的樣本陽明:

$ cat docker-compose.vol-named.yml 
version: '2' 

volumes: 
    data: 

services: 
    test: 
    image: busybox 
    command: tail -f /dev/null 
    volumes: 
    - data:/data 

$ docker-compose -f docker-compose.vol-named.yml up -d 
Creating volume "test_data" with default driver 
Creating test_test_1 

啓動後容器中,由於圖像在該位置是空的,因此將卷初始化爲空。我在那個位置創建一個快速的Hello World:

$ docker exec -it test_test_1 /bin/sh 
/# ls -al /data 
total 8 
drwxr-xr-x 2 root  root   4096 May 23 01:24 . 
drwxr-xr-x 1 root  root   4096 May 23 01:24 .. 
/# echo "hello volume" >/data/hello.txt 
/# ls -al /data 
total 12 
drwxr-xr-x 2 root  root   4096 May 23 01:24 . 
drwxr-xr-x 1 root  root   4096 May 23 01:24 .. 
-rw-r--r-- 1 root  root   13 May 23 01:24 hello.txt 
/# cat /data/hello.txt 
hello volume 
/# exit 

體積泊塢窗可見之外,目前還沒有一種docker-compose down後:

$ docker volume ls | grep test_ 
local    test_data 

$ docker-compose -f docker-compose.vol-named.yml down 
Stopping test_test_1 ... done 
Removing test_test_1 ... done 
Removing network test_default 

$ docker volume ls | grep test_ 
local    test_data 

重塑容器使用舊卷與文件仍可見裏面:

$ docker-compose -f docker-compose.vol-named.yml up -d 
Creating network "test_default" with the default driver 
Creating test_test_1 

$ docker exec -it test_test_1 /bin/sh 
/# cat /data/hello.txt 
hello volume 
/# exit 

和運行docker-compose down -v終於將同時刪除容器體積:

$ docker-compose -f docker-compose.vol-named.yml down -v 
Stopping test_test_1 ... done 
Removing test_test_1 ... done 
Removing network test_default 
Removing volume test_data 

$ docker volume ls | grep test_ 

$ 

如果您發現只有在使用stop/start而不是down/up的情況下才會保留數據,那麼您的數據將存儲在容器中而不是卷中,並且容器不會持續存在。確保容器內數據的位置正確,以避免這種情況。

+0

很好的澄清。+1 – VonC

+0

數據「在容器中」而不是數量意味着什麼?我假設存儲在映射到卷的目錄中的任何內容都將位於卷中? –

+0

是的,但正如OP所示,如果您沒有將卷映射到正確的位置,則您的數據不在卷中,而是在容器的RW層中。當你刪除你的容器時,對該容器(主要是RW文件系統層)所做的所有未存儲在卷中的更改都將丟失。 – BMitch