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
根据日志显示,确实已经将 folder1 和 folder2 中的所有子目录复制到了 workdir 目录。
作为一个额外的说明,我们选择这个示例是为了展示合并行为。如果我们只想同时将 folder1 和 folder2 的内容复制到图像的 workdir 目录,我们可以利用 COPY 可以接受多个源的事实:
FROM ubuntu:latest
COPY folder1/ folder2/ /workdir/
RUN ls --recursive /workdir/
4. 总结
在这篇教程中,我们了解了如何在不破坏子目录结构的情况下将本地目录复制到 Docker 镜像中。
如常,代码可以在 GitHub 上找到。