如何在 Docker 容器中將檔案從一個資料夾複製到另一個資料夾?
簡介
在本文中,我們將討論“如何將檔案以及目錄從主機作業系統傳輸到 Docker 容器環境”。所有這些命令的需求在於,開發人員很多時候需要向 Docker 容器提供各種型別的檔案,這些檔案包括配置檔案、安全和身份驗證檔案、應用程式檔案等等。因此,這是一個非常簡單且重要的任務,在 Docker 守護程序上建立 Docker 容器時或建立之後都需要執行。在建立 Docker 映象以及之後從該映象建立 Docker 容器時,也需要使用一些命令。
命令型別
有兩種型別的命令可用於 Docker 容器傳輸檔案,一種是從終端或 CLI(命令列介面),另一種是在建立 Dockerfile 時。我們還有一些 Docker compose 的作用域可以將檔案傳輸到 Docker 容器。
使用終端命令
為了在您的系統上實現這些命令,Docker 守護程序必須處於執行狀態,因為這些命令是 Docker 客戶端應用程式的基本命令。
主機到容器和容器到主機。
命令 1:Docker cp
首先,我們需要建立一個測試 Docker 容器,這裡我們使用了 busybox Docker 映象。使用此命令以互動式和分離模式建立容器。
$docker run -itd --name cont1 busybox
輸出
21e7886419a1c1475af4dcfcda868a43bd272537153f8dcfbd201a357305644e
現在容器已建立。
變體 1:主機到容器
假設我們想要將一個文字檔案傳輸到容器中,即從主機到 Docker 容器。
$nano test.txt
輸入
HELLO FROM TUTORIALSPOINT. This is a text file that has to be transferred to the Docker container.
現在使用以下命令將其複製到“cont1” busybox 容器。
命令的通用語法:$docker cp [源路徑] [容器:目標路徑]
$docker cp /home/hemant/test.txt cont1:/
現在交叉檢查檔案是否已複製到容器中。首先進入容器,然後檢查檔案。
$docker exec -it cont1 sh
示例
在終端上列印檔案。
/#cat test.txt
輸出
HELLO FROM TUTORIALSPOINT This is a text file that has to be transferred to the Docker container.
示例
因此,檔案已成功複製。除了使用 Docker 容器的名稱外,我們還可以使用容器 ID 來複制檔案。
$docker ps
輸出
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 21e7886419a1 busybox "sh" 10 hours ago Up 14 minutes cont1
使用“容器 ID”
$docker cp /home/hemant/test.txt 21e7886419a1:/
變體 2:容器到主機
要將檔案從容器複製到主機,請反轉上述示例中使用的 [源路徑] 和 [目標路徑]。
進入容器並建立一個檔案“test2.txt”,然後將其傳輸到主機。
$docker exec -it cont1 sh
輸出
/# vi test2.txt
輸入
HELLO FROM INSIDE OF THE DOCKER CONTAINER.
現在退出容器並返回到主機終端,並執行以下命令以在主機計算機上獲取該“test2.txt”檔案。
$docker cp cont1:/test.txt .
檢查檔案
$cat test2.txt
輸出
HELLO FROM INSIDE OF THE DOCKER CONTAINER.
因此,複製成功。
變體 3:Docker container cp
命令“docker cp”也可以用作“docker container cp”,下面我們實現了相同的操作。無需更改任何內容,所有步驟都類似。
$docker container cp cont1:/test2.txt .
命令 2:Docker 卷
另一種最常用的從容器獲取檔案副本的方法。這也有助於為容器建立永續性資料。列出系統上存在的所有 docker 卷。
$docker volume ls
現在建立您自己的卷“database”,該卷可用於連線到任何容器。
語法 - docker volume create <卷名稱>
$docker volume create database
檢查卷是否已建立。
$docker volume ls
輸出
DRIVER VOLUME NAME
local volume1
local database
local volume2
現在使用此卷並使用“-v”標籤將其連線到容器。通用
語法 - docker run –it –v 卷-/容器目錄 映象
$docker run -it --name cont2 -v database:/database busybox
讓我們看看 docker 卷是否可以用於將資料從容器儲存到主機。進入容器“cont2”,建立一個文字檔案,然後退出容器。
$docker exec -it cont2 sh /#cd database /#touch databasefile.txt //exit the container $exit
現在讓我們建立一個新的容器“cont3”,將同一個 docker 卷連結到此容器,然後檢查 databasefile.txt 是否存在。
$docker run −itd --name cont3 -v database:/database busybox //get inside this container $docker exec -it cont3 sh //change to the database directory /#cd database //list the items /#ls Output: databasefile.txt
因此,資料已成功儲存和複製。
使用 Dockerfile
Dockerfile 用於透過向其新增各種層來建立 docker 映象。我們有一些層可以幫助將資料從主機或網際網路複製或傳輸到容器映象。
命令 1:ADD
ADD 命令可以用於不同的目的。
變體 1:解壓縮檔案。
通用語法 - ADD 原始檔位置 目標目錄路徑
預設情況下,如果 ADD 給定的是壓縮檔案,則會在構建映象時提取該檔案並將其儲存在容器映象中。
ADD compressed_file.extension /container_folder_name
但是提取僅限於儲存在主機上的原始檔。它不會提取網路儲存的壓縮檔案。並且它對提取的支援的副檔名也有限。
變體 2:從網路複製
通用語法與上面提到的相同,只是我們不必提供本地路徑,而只需提供檔案的遠端路徑位置。
ADD <remote_path_or_link_to_file> <destination_folder_on_container_image>
示例
假設我們想要將 Tutorialspoint 網站的 HTML 網頁下載到我們的 apache webserver 以進行一些測試。我們使用以下 ADD 層。
ADD https://tutorialspoint.tw/index.htm /usr/local/apache2/htdocs/
現在我們可以在 Docker 容器上執行此網頁並執行測試。如果傳遞的連結是壓縮檔案,它不會提取檔案,而是將其下載到提到的路徑。
命令 2:COPY
此命令沒有變體,它很簡單,只執行將提到的檔案複製到目標位置的任務。它不會像我們在 ADD 命令中看到的那樣執行提取,並且它不能從網路下載。
COPY <原始檔路徑> <容器映象上的目標位置>
命令 3:RUN
Curl 和 Wget 命令用於從網路複製檔案。在使用 dockerfile 準備映象時,我們將使用這些命令。
RUN curl --output <downloadedfile> <url_to_the_web_file> RUN wget <url_to_the_web_file>
結論
從本地和遠端機器複製的原因如下所示。
複製配置檔案。
複製應用程式的實際程式碼。
從網路複製以進行測試。
從網路複製以進行測試。
將容器資料複製到主機以實現永續性資料。