在Dockerfile副本中保留子目录结构

2023/05/23

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上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章