1. 概述

在这篇文章中,我们将学习如何在不破坏子目录结构的情况下将本地目录复制到 Docker 镜像中。

2. 将本地目录复制到镜像中

让我们创建以下文件树:

|   Dockerfile
|   
\---folder1
    +---subfolder1
    |       file1.txt
    |       
    \---subfolder2
            file2.txt

可以通过运行以下命令来完成此操作:

$ mkdir folder1
$ cd folder1
$ mkdir subfolder1
$ cd subfolder1
$ touch file1.txt
$ cd ..
$ mkdir subfolder2
$ cd subfolder2
$ touch file2.txt
$ cd ../..

接下来,我们将在名为 Dockerfile 的文件中打开:

$ touch Dockerfile

然后,让我们插入以下内容:

FROM ubuntu:latest
COPY folder1/ /workdir/
RUN ls --recursive /workdir/

我们逐行理解内容:

  • 第一行声明我们正在使用最新版本的 ubuntu 镜像作为基础镜像。
  • 第二行将 folder1 目录的内容复制到图像的 workdir 目录中。 如果 workdir 不存在,则会创建它。
  • 第三行在图像的 shell 中执行 ls 命令,以递归列出 workdir 文件夹中所有子目录的内容。

我们现在可以构建我们的 Docker 镜像:

$ docker build .
#4 [1/3] FROM docker.io/library/ubuntu:latest
#6 [2/3] COPY folder1/ /workdir/
#7 [3/3] RUN ls --recursive /workdir/
#7 0.324 /workdir/:
#7 0.324 subfolder1
#7 0.324 subfolder2
#7 0.324
#7 0.324 /workdir/subfolder1:
#7 0.324 file1.txt
#7 0.324
#7 0.324 /workdir/subfolder2:
#7 0.324 file2.txt

正如预期的那样,递归打印 workdir 内容显示它包含了 folder1 中的所有子目录和文件。

3. 将本地目录合并到镜像中

现在,让我们稍微更新文件树以匹配以下内容:

|   Dockerfile
|   
+---folder1
|   +---subfolder1
|   |       file1.txt
|   |       
|   \---subfolder2
|           file2.txt
|           
\---folder2
        file3.txt

为了进行此更改,我们将运行以下命令:

$ mkdir folder2
$ cd folder2
$ touch file3.txt
$ cd ..

之后,我们希望将 folder2 的内容合并到图像的 workdir 中。 让我们完成我们的 Dockerfile

FROM ubuntu:latest
COPY folder1/ /workdir/
RUN ls --recursive /workdir/
COPY folder2/ /workdir/
RUN ls --recursive /workdir/

第二个 COPY 指令不会删除之前添加的文件。让我们构建我们的镜像来检查这种行为:

$ docker build .
#4 [1/5] FROM docker.io/library/ubuntu:latest
#6 [2/5] COPY folder1/ /workdir/
#7 [3/5] RUN ls --recursive /workdir/
#8 [4/5] COPY folder2/ /workdir/
#9 [5/5] RUN ls --recursive /workdir/
#9 0.398 /workdir/:
#9 0.398 file3.txt
#9 0.398 subfolder1
#9 0.398 subfolder2
#9 0.398
#9 0.398 /workdir/subfolder1:
#9 0.398 file1.txt
#9 0.398
#9 0.398 /workdir/subfolder2:
#9 0.398 file2.txt

根据日志显示,确实已经将 folder1folder2 中的所有子目录复制到了 workdir 目录。

作为一个额外的说明,我们选择这个示例是为了展示合并行为。如果我们只想同时将 folder1folder2 的内容复制到图像的 workdir 目录,我们可以利用 COPY 可以接受多个源的事实:

FROM ubuntu:latest
COPY folder1/ folder2/ /workdir/
RUN ls --recursive /workdir/

4. 总结

在这篇教程中,我们了解了如何在不破坏子目录结构的情况下将本地目录复制到 Docker 镜像中。

如常,代码可以在 GitHub 上找到。