Linux容器已经成为一个热门话题,确保容器映像很小是一种很好的做法。本文提供了有关如何构建较小的Fedora容器映像的一些提示。
Microdnf
Fedora的DNF是用Python编写的,因为它有各种各样的插件,所以它的设计是可扩展的。但是有一个Fedora基础容器映像替换,它使用一个名为microdnf的较小的包管理器,用C语言编写。要在Dockerfile中使用这个最小的映像,FROM行应如下所示:
FROM registry.fedoraproject.org/fedora-minimal: 30
如果您的图像不需要像Python这样的典型DNF依赖项,例如,如果您正在制作NodeJS图像,那么这是一项重要的节省。
在一个层中安装和清理
为了节省空间,使用dnf clean all或其microdnf等效microdnf clean all来删除存储库元数据非常重要。但是您不应该分两步执行此操作,因为它实际上将这些文件保存在容器图像中,然后在另一层中将它们标记为已删除。要正确执行此操作,您应该以这种方式完成安装和清理:
FROM registry.fedoraproject.org/fedora-minimal: 30
运行microdnf安装nodejs && microdnf清除所有
用microdnf模块化
模块化是一种让您可以选择不同堆栈版本的方法。例如,您可能希望在项目中使用非LTS NodeJS v11,在另一个中使用旧LTS NodeJS v8,为另一个使用最新的LTS NodeJS v10。您可以使用冒号指定流。#dnf模块列表
#dnf module install nodejs: 8
dnf module install命令意味着两个命令,一个用于启用流,另一个用于从中安装nodejs。
#dnf module enable nodejs: 8
#dnf install nodejs
尽管microdnf不提供与模块化相关的任何命令,但是可以启用具有配置文件的模块,并且libdnf(由microdnf使用)似乎支持模块化流。该文件如下所示:
/etc/dnf/modules.d/nodejs.module
[的NodeJS]
NAME=的NodeJS
流=8
简介=
状态=启用
使用模块化microdnf的完整Dockerfile如下所示:
FROM registry.fedoraproject.org/fedora-minimal: 30
跑 \
Echo -e'[nodejs] \ nname=nodejs \ nstream=8 \ nprofiles=\ nstate=enabled \ n'>
/etc/dnf/modules.d/nodejs.module && \
Microdnf安装nodejs zopfli findutils busybox && \
Microdnf清洁所有
多阶段构建
在许多情况下,您可能需要很多构建时依赖项,而不需要运行软件,例如为静态链接依赖项构建Go二进制文件。多阶段构建是分离应用程序构建和应用程序运行时的有效方法。
例如,以下Dockerfile构建一个Go应用程序confd。
#building container
FROM registry.fedoraproject.org/fedora-minimal AS build
运行mkdir/go && microdnf install golang && microdnf clean all
WORKDIR /去
RUN导出GOPATH=/go; CGO_ENABLED=0去github.com/kelseyhightower/confdFROM registry.fedoraproject.org/fedora-minimal
WORKDIR /
COPY --from=build/go/bin/confd/usr/local/bin
CMD ['confd']
通过在FROM指令之后添加AS并从基本容器映像添加另一个FROM,然后使用COPY --from=指令将内容从内置容器复制到第二个容器来完成多阶段构建。
您可以使用podman构建和运行此Dockerfile:
$ podman build -t myconfd。
$ podman运行-it myconfd