如何在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度视图。清楚地说明了排除、包含以及此文件的重要性。要掌握该主题,请创建不同的环境并使用上述方法进行实现。