Linux容器已成为热门话题,保持容器镜像较小被认为是一种很好的做法。本文提供了一些关于如何构建更小的Fedora容器镜像的技巧。microdnfFedora的DNF是用Python编写的,并且由于其种类繁多的插件而被设计为可扩展的。但是Fedora基础容器镜像有一个替代方案,它使用一个名为microdnf的较小包管理器,用C编写。要在Dockerfile中使用这个最小镜像,FROM行应该如下所示:FROMregistry.fedoraproject.org/fedora-最小值:30如果你的镜像不需要像Python这样的典型DNF依赖项,例如,如果你正在制作,这在使用NodeJS镜像时会节省很多。在一层中安装和清理为了节省空间,使用dnfcleanall或它的microdnf等效microdnfcleanall删除存储库元数据很重要。但是您不应该分两步执行此操作,因为这实际上会将这些文件保留在容器映像中,然后在另一层中将它们标记为删除。要正确执行此操作,您应该像这样一步完成安装和清理:FROMregistry.fedoraproject.org/fedora-minimal:30RUNmicrodnfinstallnodejs&µdnfcleanall堆栈版本。例如,您可能需要在一个项目中使用非LTSNodeJSv11,另一个项目使用旧的LTSNodeJSv8,另一个项目使用最新的LTSNodeJSv10。您可以使用冒号指定流。#dnfmodulelist#dnfmoduleinstallnodejs:8dnfmoduleinstall命令意味着两个命令,一个用于启用流,另一个用于从中安装nodejs。#dnfmoduleenablenodejs:8#dnfinstallnodejs虽然microdnf没有提供任何与模块化相关的命令,但是可以启用带有配置文件的模块,而且libdnf(microdnf使用的)似乎支持模块化流。该文件如下所示:/etc/dnf/modules.d/nodejs.module[nodejs]name=nodejsstream=8profiles=state=enabled使用模块化microdnf的完整Dockerfile如下所示:FROMregistry.fedoraproject.org/fedora-minimal:30RUN\echo-e"[nodejs]\nname=nodejs\nstream=8\nprofiles=\nstate=enabled\n">/etc/dnf/modules.d/nodejs.module&&\microdnf安装nodejszopflifindutilsbusybox&&\microdnfcleanallmulti-stagebuilds在很多情况下,您可能需要大量运行软件不需要的构建时依赖项,例如构建静态链接依赖项的Go二进制文件。多阶段构建是分离应用程序构建和应用程序运行时的有效方式。例如,以下Dockerfile构建了一个Go应用程序confd。#构建容器FROMregistry.fedoraproject.org/fedora-minimalASbuildRUNmkdir/go&µdnfinstallgolang&µdnfcleanallWORKDIR/goRUNexportGOPATH=/go;CGO_ENABLED=0从注册表中获取github.com/kelseyhightower/confdfororged。/fedora-minimalWORKDIR/COPY--from=build/go/bin/confd/usr/local/binCMD["confd"]通过在FROM指令后添加AS并从基础容器镜像添加另一个FROM然后使用COPY--from=指令将构建容器中的内容复制到第二个容器以完成多阶段构建。这个Dockerfile可以用podman构建和运行:$podmanbuild-tmyconfd.$podmanrun-itmyconfd
