如何在Docker中忽略文件?


介绍

在这篇文章中,我们将学习Docker中的忽略文件。如何创建忽略文件以及如何使用各种方法将文件和文件夹添加到忽略文件中。所有先决条件知识都以逐步的方式列出。在了解代码行业中忽略文件的要求之前,请不要直接跳到实现部分。

什么是忽略文件?

忽略文件是在不同的系统中创建的,例如Git仓库和Dockerfile。这些文件有助于排除某些文件和目录不被用于或复制到输出中。Dockerfile的输出是镜像,对于Git,它可能是提交。DevOps中一些最常用的忽略文件示例是“gitignore”和“dockerignore”。

要忽略的文件类型

主要任务是忽略某些内容。这些内容可以是不同类型的。例如,它可能是Python中的程序文件或带有子目录的ReactJS应用程序目录。所有这些文件都列在下面的列表中。

  • 目录

  • 文件 - 文本或程序文件

  • 子目录

  • .dockerignore本身

忽略这些文件的必要性是因为我们不再需要这些文件在最终产品中。这些文件只需要在主机上。

方法

在本节中,我们将学习如何通过将不同类型的文件添加到dockerignore文件中来排除它们。

所有将要出现在dockerignore中的文件都应相对于Docker上下文目录进行说明。Docker上下文是包含需要添加到镜像中所有有用文件的目录路径。在构建镜像时,我们通常使用.(点)作为Docker上下文。

创建“.dockerignore”文件

“.dockerignore”应该在Dockerfile所在的目录中创建,否则它将无法工作。使用以下命令创建和排除各种类型的文件。

$touch .dockerignore

我们创建了一个目录结构来解释所有这些方法。

$tree -la

输出

.
├── dir1
├── dir2
├── dir3
│ ├── dir3_1
│ │ └── file_dir3_1.txt
│ ├── dir3_2
│ ├── file1_dir3.txt
│ └── file2_dir3.py
├── Dockerfile
├── .dockerignore
├── file1.txt
├── file2.sh
├── file3.py
├── no_ex1
└── No_ex2


5 directories, 10 files

打开忽略文件以从上面的目录结构中添加各种文件。

$nano .dockerignore

在docker忽略文件中添加不同类型的文件、目录和注释有一些规则。

在dockerignore文件中添加注释

使用#开头作为注释将该行视为注释。

#This is a comment in the .dockerignore file

忽略Docker上下文或根目录级别的目录

dir1
dir2

这将忽略存在于Docker上下文根级别的目录(dir1和dir2)。请参考上面的目录结构。

忽略所有文件和目录

要排除名称中包含“file”的所有文件和目录。这些文件将仅来自根目录。

file*

忽略Docker上下文下一级子目录

忽略来自根目录任何子目录的文件和目录。

#using */ to go one level down
*/file1_dir3.txt

忽略Docker上下文下两级子目录

这与上述方法非常相似。

#using */*/ to go two level down
*/*/file_dir3_1.txt

重新包含文件

在某些特殊情况下,我们希望包含之前被排除的特定文件。

*.txt
!myfile.txt

假设您正在创建Python容器镜像。根目录包含来自不同贡献者的所有Python程序,因此您不能删除它们,并且您必须仅使用该根目录。您可以执行以下示例以排除所有Python程序,然后重新包含您的Python程序文件。

步骤1 - 假设根目录已填充Python文件

Prg1.py. Prg2.py, Prg3.py …………..and myprogram.py

步骤2 - 创建如下所示的.dockerignore文件。

#ignore all the python program files
*.py
#reinclude your python program file
!myprogram.py

此过程将更快,无需将不需要的内容COPY/ADD到Docker容器镜像中。

实现

在这里,我们将创建一个完整的环境,该环境将使用Dockerfile、.dockerignore并使用这些文件构建容器镜像。使用的方法部分中提到的相同目录结构。

.
├── dir1
├── dir2
├── dir3
│ ├── dir3_1
│ │ └── file_dir3_1.txt
│ ├── dir3_2
│ ├── file1_dir3.txt
│ └── file2_dir3.py
├── Dockerfile
├── .dockerignore
├── file1.txt
├── file2.sh
├── file3.py
├── no_ex1
└── No_ex2

5 directories, 10 files

步骤1 - 创建Dockerfile并添加代码。

$nano Dockerfile

输入

#for the base image we are using busybox
FROM busybox:latest
#set a working directory
WORKDIR /my_context_directory
#copy everything from the build context to the working directory of the
#image
COPY . .
# list all the copied items
RUN ls -l

保存文件。

步骤2 - 创建.dockerignore文件

$nano .dockerignore

输入

#exclude the file_dir3_1.txt
file_dir3_1.txt
#exclude file from the root
file3.py
#exclude a directory one level down
*/dir3_2

保存文件

步骤3 - 构建镜像并检查构建输出

$docker build –t test_ignore .

输出

Sending build context to Docker daemon 9.728kB
Step 1/4 : FROM busybox:latest
   ---> 9d5226e6ce3f
Step 2/4 : WORKDIR /my_context_directory
   ---> Running in 49d65f57621d
Removing intermediate container 49d65f57621d
   ---> 386c30f8f511
Step 3/4 : COPY . .
   ---> 75f65dace2be
Step 4/4 : RUN ls -l
   ---> Running in bd8bbec7d3f9
total 12
-rw-rw-r-- 1 root root 0 Dec 9 03:47 No_ex2
drwxrwxr-x 2 root root 4096 Dec 9 03:47 dir1
drwxrwxr-x 2 root root 4096 Dec 9 03:47 dir2
drwxrwxr-x 3 root root 4096 Dec 9 03:48 dir3
-rw-rw-r-- 1 root root 0 Dec 9 03:46 file1.txt
-rw-rw-r-- 1 root root 0 Dec 9 03:46 file2.sh
-rw-rw-r-- 1 root root 0 Dec 9 03:47 no_ex1
Removing intermediate container bd8bbec7d3f9
   ---> 084bb699260f
Successfully built 084bb699260f
Successfully tagged test_ignore:latest

输出显示,除了dockerignore文件中的文件外,所有其他文件都已复制到容器镜像中。

结论

在这篇文章中,我们已经探索了“.dockerignore”文件的完整360度视图。清楚地说明了排除、包含以及此文件的重要性。要掌握该主题,请创建不同的环境并使用上述方法进行实现。

更新于:2023年1月11日

6K+浏览量

启动您的职业生涯

通过完成课程获得认证

开始
广告