Docker漸漸成為前端的一個工具,它像一個通用包裝,可以把各種環境包裹其中,從而實現跨裝置的相容。使用的過程中,往往會需要將本地的檔案和docker容器內部的檔案互傳:將主機的檔案傳遞給容器內,讓裡面的工具讀寫;將容器內的檔案複製出來,修改了再傳入...
一、主機到 Docker 容器/映象的檔案傳輸
將檔案從主機傳輸到容器或映象中,可以在容器啟動前或容器執行時進行。
1. 使用 COPY
或 ADD
指令(構建映象時)
當你在建立Docker 映象
時,Dockerfile 提供了兩條指令 COPY
和 ADD
,它們用於將主機上的檔案複製
到映象中。
COPY
指令:將主機的檔案或目錄複製到映象的指定路徑。ADD
指令:除了COPY
的功能外,還支援複製遠端檔案(如 URL)並自動解壓壓縮檔案(如.tar
)。
示例
# 從主機的工作目錄將檔案複製到映象的 /app 目錄 # 或者使用 ADD 指令(可以解壓 .tar 檔案) ADD ./myarchive.tar.gz /app
這種方式適用於在構建映象時預先將主機檔案打包進映象內。它的優點是映象內的檔案是靜態的,適合分發和部署。
需要注意的是,複製檔案不能跨越上下文,比如你構建的映象在 /a/b/c目錄,無法將/a目錄下的檔案複製到映象內,或是COPY ../xxx 的也不行***
2. 使用 docker run
的 -v
選項(容器啟動時掛載卷)
當容器啟動時,可以透過 -v
或 --mount
選項將主機目錄掛載到容器中。這種方法不會將檔案打包進映象,而是在容器執行時實時訪問主機上的檔案。
示例
docker run -v /path/on/host:/path/in/container my-container
在此示例中,主機的 /path/on/host
目錄會掛載到容器的 /path/in/container
目錄中。容器中的應用可以實時訪問和修改主機上的檔案,這種方式非常適合開發時同步檔案。
3. 使用 docker cp
命令(執行時複製)
docker cp
命令允許在容器執行時將檔案從主機複製到容器中。
示例:
docker cp /path/on/host my-container:/path/in/container
這種方式適合偶爾的檔案傳輸,不需要重啟容器。你可以在容器執行時向容器內新增或更新檔案。
二、Docker 容器/映象到主機的檔案傳輸
Docker 同樣提供多種方法將檔案從容器或映象傳輸到主機中。
1. 使用 docker cp
命令
最直接的方法是使用 docker cp
命令,它允許從正在執行的容器或已經停止的容器中將檔案複製到主機。docker cp
是一個非常靈活的工具,它既支援檔案也支援目錄的傳輸。
示例:
docker cp my-container:/path/in/container /path/on/host
即使容器已經停止,docker cp
仍然可以工作,因為 Docker 會保留容器的檔案系統狀態,直到容器被刪除。
2. 在容器啟動時掛載卷(雙向傳輸)
如前所述,使用 docker run -v
或 --mount
選項可以實現主機與容器之間的檔案共享。由於這是雙向傳輸,因此容器對掛載卷中資料的修改會同步到主機上。
示例:
docker run -v /path/on/host:/path/in/container my-container
容器內的任何檔案更改都會反映在主機的 /path/on/host
目錄中。這種方式對於需要實時同步資料的情況非常有效,例如開發時頻繁修改的檔案。
3. 延伸之複製映象檔案到本地
此時就需要用docker run使用映象啟動容器,然後再利用docker cp複製到本地
三、適合場景的選擇
-
使用
COPY
/ADD
指令:適合在構建映象時靜態地將檔案打包進映象,適合用於映象的分發和部署。 -
使用
docker run -v
掛載卷:適合開發環境或需要實時同步檔案的場景,避免了每次修改檔案都需要重啟容器。 -
使用
docker cp
:適合容器執行時或容器停止後從容器中提取檔案,適用於需要從容器中臨時獲取或更新檔案的情況。
四、注意事項
-
許可權問題:在掛載主機目錄到容器時,容器內的使用者許可權可能會與主機使用者不一致,導致檔案無法訪問或修改。可以透過設定正確的許可權或使用者來解決這個問題。
-
容器掛掉後的檔案傳輸:即使容器已經停止,
docker cp
仍然可以從停止的容器中提取檔案。容器刪除前,檔案系統狀態會被保留。 -
效能影響:在使用
-v
掛載卷時,主機與容器間的檔案互動效能可能會受到一定影響,特別是在處理大量檔案時,需要測試效能是否滿足要求。
相信看到這裡,記得動手操練下。相信你就能夠熟練掌握docker和主機之間的檔案互轉了,其實docker就是一個檔案系統的描述,一層層的累起來,映象是抽象的定義類似Class,容器類似例項化的物件,透過多種方法實現容器和主機的檔案互轉就可以,甚至可透過http哦