Dockerfile 中有一個 VOLUME 命令,可以把掛載一個目錄到主機目錄,但是在主機目錄下的名字是隨機的,除非用戶用 -v 指定,但是如果在 Dockerfile 中不用 VOLUME,隻在運行時用 -v 指定也能達到效果,那麼就有一個問題,VOLUME 在 Dockerfile 中到底有多少用,在 Host 下創建了幾個用戶一般找不到的文件到底有多少使用價值,大部分情況下用戶都是要手動使用 -v 重新指定掛載目錄,那 VOLUME 命令就顯得很雞肋。
VOLUME 是否有什麼比較重要的用處我沒有理解呢?
我也對此有些疑問,所以找了一些資料,說下我的看法。
找到了官方的userguide: https://docs.docker.com/engine/userguide...
從中了解了一點:VOLUME並非只是聲明,它會把指定路徑重新加載一遍,我透過inspect容器也發現了這一點。
這是在Dockerfile指定了VOLUME,並沒有指定-v,查看容器的Mounts資訊:
這是在上一個的基礎上,指定了-v,查看容器的Mounts資訊:
然後你去
/var/lib/docker/volumes/b3e2dcacd3f9f40b43ccd5773d45ca74f0f49b02d3da17749cb378ff9f59bb67/_data
目錄下看一下,大致就清楚了。你可以把VOLUME理解為,從鏡像複製指定磁碟區的資料夾到本地
/var/lib/docker/volumes/xxxxxxxxx/文件夹
,然後把本地的該資料夾掛載到容器裡面去。本質上還是相當於一個本地資料夾掛載而已。
繼續補充,因為VOLUME實際上就是在本地新建了一個資料夾掛載了,那麼實際上容器內部的資料夾有三種情況:
1、沒有指定VOLUME也沒有指定-v,這種是普通資料夾。
2、指定了VOLUME沒有指定-v,這種資料夾可以在不同容器之間共享,但是無法在本地修改。
3、指定了-v的資料夾,這種資料夾可以在不同容器之間共享,並且可以在本地修改。
那就列舉一種需要在不同容器之間共用且不需要在本地修改的情況。
首先,我們先了解容器中取得動態資料的方式:
1、本地提供,掛載到容器
2、遠端提供,從遠端下載
3、產生提供,在容器內部產生
後面兩種指令都不需要在本地修改,但是他們產生的動態資料卻可能需要共用。
下載指令,例如git clone直接從git伺服器拉取程式碼,不需要掛載本機資料夾。
產生指令,例如jekyll(靜態網站產生器),你可能會掛載一個程式碼資料夾,然後build目錄裡產生的靜態網頁檔案需要提供給Apache伺服器,那麼你需要指定build目錄為VOLUME。
VOLUME
指令主要是在開發環境下非常有用:編輯程式碼的時候,直接在宿主機裡進行編輯,然後在 docker 裡同步跑,無需反覆啟動關閉,這能發揮開發環境的最高性能。
對於
VOLUME
我更喜欢使用docker-compose
進行指定:docker-compose 可以將多個服務進行捆綁了跑,上面的範例就是 web 服務和 db 服務分開來跑,非常適合組成複雜的環境。