📜  如何使用单个Dockerfile合并多个基本映像?

📅  最后修改于: 2021-04-16 08:39:08             🧑  作者: Mango

如果您正在使用Docker容器从事大型微服务项目,则开发周期包括一些阶段。现在,在开发的不同阶段维护不同的dockerfile会占用大量资源,导致冗余,因为几个项目组件可能包含公用文件。确实没有必要在构建阶段,开发阶段,发布阶段和测试阶段使用单独的dockerfile

在更高版本的Docker中,它提供了多级dockerfiles的使用。使用多阶段dockerfiles ,您可以使用多个基本映像以及以前的中间映像层来构建新的映像层。基本上,它允许您创建完整的Docker指令层次结构,这些指令可用于创建具有不同功能的不同映像集,但所有映像均位于单个dockerfile中。特别是,使用两个命令– FROMAS ,可以创建一个多阶段dockerfile 。它允许您在先前的层之上创建多个图像层,并且AS命令为中间图像层提供了虚拟名称。 dockerfile中的最后一个FROM命令创建实际的最终映像。

在本文中,我们将看到一个多阶段dockerfile的示例,以及如何在Docker项目中使用它。

1.创建一个多阶段的dockerfile

首先,让我们考虑以下dockerfile

#Create the base OS image
FROM python:3 AS base

#Update the OS ubuntu image
RUN apt-get -y update

#Install packages
RUN apt-get -y install firefox \
&& apt-get -y install vim

#Create another image layer on top of base to install requirements
FROM base AS requirements

#Install the requirements
RUN pip3 install -r requirements.txt

#Create an intermediate image layer for testing purpose
FROM requirements as test

#Create the build context
COPY /usr/src/my-app /desktop/my-app

#Test the final app
CMD ["python3", "index.py"]

让我们一步一步地了解上述dockerfile

  1. 首先,我们直接从Docker注册表中提取了Python 3基本映像。默认情况下,它还将基本映像的操作系统设置为Ubuntu。我们为该图像层使用了一个名为“ base”的虚拟名称。
  2. 然后,我们在Ubuntu操作系统上运行apt更新。
  3. 之后,我们将安装一些基本软件包,例如Firefox浏览器和vim文本编辑器。
  4. 使用基础映像,我们在其之上创建了另一个映像层,称为“ requirements”,它从名为“ requirements.txt”的单独文件中安装了依赖项。
  5. 使用此图像作为基础图像,我们创建了另一个称为“ test”的中间图像层,该层创建构建上下文并复制文件和目录,最后运行Python应用程序进行测试。

2.创建需求文件

在需求文件中,我们提到了要安装的依赖项。

flask
pandas
numpy

3.创建index.py文件

我们要运行并在dockerfile的CMD参数中指定的主要文件是index.py文件。在index.py文件中,我们仅包含用于演示目的的打印语句。

print("geeksforgeeks")

4.构建Docker映像

要构建Docker映像,我们使用Docker Build命令。

sudo docker build -t sample-image .
建立形象

建立形象

5.运行Docker容器

成功构建Docker映像后,我们可以使用Docker run命令运行容器。

sudo docker run -it sample-image
运行容器

运行容器

我们可以清楚地看到FROM和AS命令的组合如何帮助我们为所有项目或项目组件创建唯一的层次结构。基本上,它使我们能够根据组合这些命令的方式来执行图像组件的继承,包括分层或多重继承。

事实证明,这非常有用,因为它允许您使用单个dockerfile执行所有任务,从而简化了版本管理,可以更好地概述整个项目,并且通过消除使用的需要减小了最终映像的整体大小。由于现在只有一个最终图像,因此不同图像中的相同文件相同。

总而言之,在本文中,我们讨论了如何使用Docker多阶段构建来使用和继承多个基础,并在单个dockerfile中自定义图像层。