如何使用Docker cp複製文件到Docker容器

如果您需要從Docker 主機複製檔案到您的Docker 容器,這篇教程就是為您準備的。

在這篇教程中,您將學習使用不同的方法將檔案從 Docker 主機複製到 Docker 容器。

讓我們開始吧!

先決條件

如果您希望一步一步地跟隨,請確保您具備以下條件:

  • 在 Linux 主機上安裝了 Docker。本教程使用的是 Docker v19.03.11 版本。您可以通過運行docker version來確認您的 Docker 版本。

使用docker cp命令複製檔案

開始這篇教程,您將學習使用docker cp命令將檔案從 Docker 主機複製到容器。docker cp命令可以在容器和 Docker 主機的本地檔案系統之間互相複製檔案或資料夾。

讓我們透過一個例子來學習如何使用 Docker cp 命令。

1. 在您的本地機器上打開終端機。

2. 使用 touch 命令創建一個名為 myfile.txt 的文件。將會從 Docker 主機複製 myfile.txt 到容器中。

touch myfile.txt

3. 執行 docker run 命令。下面的 docker run 將在後台創建一個新的容器。下面的命令包含以下三個參數:

  • d flag that runs the container in the background and keeps it alive until deleted.
  • p flag publishes a container’s port 80 to the host on port 80.
  • nginx 將是用於運行容器的映像。
sudo docker run -d -p 80:80 nginx
Executing the Docker run command

4. 使用 docker ps 命令驗證 Docker 容器是否成功創建。執行 docker ps 命令後,您應該會看到在屬性 CONTAINER ID (在下面的例子中為 ccae4670f030) 下生成了一個新值,使用了 NGINX 映像,這證實了容器已成功創建。

sudo docker ps
Verifying the docker container by running the docker ps command

在執行 Docker cp 命令之前,Docker cp 命令的語法為:

  • CONTAINER: SRC_PATH 指定容器的源路徑。
  • DEST_PATH 是主機上的目的地路徑。
  • CONTAINER: DEST_PATH 是容器上的目的地路徑。

此外,您還可以在命令中使用以下參數添加 options

  • 使用`archive`或`a` – 复制文件和文件夹的用户和主要组权限。
  • 使用`L` – 指定`L`选项将允许将源路径中的任何符号链接复制到目标路径。
# 从容器复制到Docker主机的语法
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# 从Docker主机复制到容器的语法
docker cp {options} SRC_PATH CONTAINER:DEST_PATH 

5. 接下来,执行docker cp命令。docker cp命令将复制您之前创建的myfile.txt到容器的/usr/share目录。 ccae4670f030是要将myfile.txt复制到的容器ID。

sudo docker cp myfile.txt ccae4670f030:/usr/share

6. 最后,通过运行docker exec命令与/bin/bash一起,进入运行中的容器。`/bin/bash`用作Linux系统用户登录的默认 shell。

  • `i`标志表示您希望打开与容器的交互式SSH会话。即使容器未附加,`i`标志也不会关闭SSH会话。
  • `t`标志分配一个伪TTY,必须用于交互式运行命令。sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

当您运行docker exec时,您将看到您现在已连接到容器的 shell。

SSH into the running container using docker exec command

7. 登入容器後,使用ls命令驗證myfile.txt是否已經複製到容器中。

  • ls是一個列出Unix和類Unix操作系統中電腦文件的命令。
  • grep將在usr/share目錄中搜尋以字符串my開頭的所有文件或文件夾。
Verifying the files in the container

使用DockerFile複製文件

在前一節中,您已經學會了如何通過運行Docker cp命令將文件複製到容器中。如果您需要一次複製多個文件,該怎麼辦?當然,運行多個命令會增加負擔!要解決運行多個cp命令的問題,為什麼不試試使用Dockerfile通過COPY命令將文件或文件夾複製到容器中呢?

使用Dockerfile部署容器並複製文件/文件夾可以消除您在前一節中進行的手動複製步驟。Dockerfile是一個包含用戶可以在命令行上調用的所有命令的文本文檔,以組裝圖像。

讓我們創建一個Dockerfile,從中運行一個容器,並最終複製文件。

1. 創建一個名為~/host-to-container-copy-demo的文件夾,然後將工作目錄更改(cd)為該文件夾。該文件夾將包含您在此演示中創建的所有文件。

mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo

2. 現在,創建兩個名為myfile1.txt和myfile2.txt的文本文件,將它們複製並粘貼到文件中,然後保存到~/host-to-container-copy-demo目錄中。

# 我的文件1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# 我的文件2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.

3. 建立另一個文件,將以下配置複製/粘貼,並將文件保存為Dockerfile,保存在 ~/host-to-container-copy-demo 目錄中。完成後,Docker 將使用此 DockerFile 執行所有必要的命令來在任何基礎映像之上構建新的 Docker 映像。

下面的DockerFile包含了建立新容器的各種步驟/指令:

  • FROM FROM 指令初始化了一個新的構建階段並設置了後續指令的基本映像。
  • COPY COPY 指令將文件從主機機器(Docker 主機)複製到容器中。
# Dockerfile 創建新映像的指令,位於基本映像(ubuntu)之上
# 使用基本映像 ubuntu:latest
FROM ubuntu:latest
# 將我的文件1.txt 複製到容器的 /usr/share 目錄
COPY myfile1.txt /usr/share
# 將我的文件2.txt 複製到容器的 /tmp 目錄
COPY myfile2.txt /tmp

4. 透過運行 tree 命令來驗證建立新映像所需的所有文件。您應該在~/host-to-container-copy-demo 目錄下看到 Dockerfile、myfile1.txt 和 myfile2.txt

Verifies files and folders using tree command

5. 接下來,通過運行 docker build 命令來構建映像。 t 標誌用於將映像標記為 latest. 允許 Docker 從當前工作目錄中選擇所有必要的文件。

sudo docker build -t updated_ubuntu_image:latest .
Building the Docker image by running the docker build command

6. 現在,通過運行 docker images 命令來驗證新建的映像 updated_ubuntu_image。注意 REPOSITORY 屬性。此屬性是在前一步驟中使用 -t 標誌創建的標籤。

sudo docker images
Repository Attribute

7. 最後,通過運行 docker run 命令來運行新建的映像的 Docker 容器。 -it 標誌指示 Docker 分配一個與容器的 stdin 連接的 虛擬終端bash 提供了 Linux 系統用戶登錄的默認 shell。

sudo docker run -it updated_ubuntu_image bash

現在,您將會看到您已進入 Docker 容器的 Bash shell 中。

Running the container using docker run command.

8. 接下來,通過運行 ls 命令來驗證文件是否成功複製到容器中的目錄 /tmp/usr/share

Verifying the files if they are successfully copied on the container

使用 Docker Volume 命令掛載存儲卷並訪問文件

到目前為止,您已經學會了使用兩種不同的方法將文件從主機複製到容器,一種是使用docker cp命令,另一種是使用DockerFile。這一次,讓我們學習如何使用docker volume命令輕鬆共享主機和容器之間的文件系統。

假設您仍然登錄在終端上:

1. 通過運行docker volume create命令在Docker主機上創建一個卷。下面的命令將創建一個名為my-vol的卷。 sudo docker volume create my-vol

sudo docker volume create my-vol

2. 通過運行docker volume ls命令來驗證卷是否已成功創建。docker volume ls命令列出了卷。運行docker volume ls命令後,您將在VOLUME NAME屬性中看到my-vol,這表明卷已成功創建。

sudo docker volume ls
Listing the docker volumes

3. 接下來,運行docker run命令運行容器。

  • 名為volume_testing的容器使用了nginx: latest映像。
  • d flag runs the container in the background and keeps it alive until deleted.
  • v flag mounts the volume my-vol created on Docker host to the container’s destination /app directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
Running the Docker command and attaching the volume with the container

4. 確認您之前創建的 my-vol 卷是否使用 docker inspect 命令正確地與容器掛載。 Docker inspect 命令 提供容器的相關信息。運行 docker inspect 命令後,將顯示指定容器(volume_testing)的所有詳細信息,包括掛載詳情,如下所示。

sudo docker inspect volume_testing

下面的映像快照證實了您在主機上創建的卷(my-vol)已成功與容器的 /app 目錄掛載。

Verifying the volumes in the container

結論

在本教程中,您學會了從 Docker 主機到容器中複製文件或文件夾的不同方法,例如使用 Docker cp 命令、Docker 卷命令和 Dockerfile。

那麼,在從主機複製數據到 Docker 容器時,您打算使用哪種方法?

Source:
https://adamtheautomator.com/docker-cp/