本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
构建基本系统 AL2 023 容器镜像
AL2023 容器镜像由 AL2 0 AMI 23 中包含的相同软件组件构建。它包括一个软件,使基础容器层的行为与在 Amazon EC2 实例上运行的行为类似,例如包管理器dnf
。本节介绍如何从头开始构建仅包含应用程序所需的最低依赖项的容器。
注意
标准 AL2 023 容器镜像适用于大多数用例。使用标准容器映像可以轻松地在映像之上进行构建。基本容器镜像使得在镜像之上构建变得更加困难。
针对应用程序创建具有最少依赖项的容器
-
确定运行时依赖项。这将因您的应用程序而异。
-
构造一个构建
FROM scratch
的Dockerfile
/Containerfile
。Dockerfile
的以下示例可用于构建仅包含bash
shell 及其依赖项的容器。FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as build RUN mkdir /sysroot RUN dnf --releasever=$(rpm -q system-release --qf '%{VERSION}') \ --installroot /sysroot \ -y \ --setopt=install_weak_deps=False \ install bash FROM scratch COPY --from=build /sysroot / WORKDIR / ENTRYPOINT ["/bin/bash"]
-
Dockerfile
的运行方式是:-
启动一个名
build
为的 AL2 023 容器。该容器将用于引导基本容器,该容器本身不会部署,而会生成要部署的容器。 -
创建
/sysroot
目录。该目录将是build
容器安装基本容器所需的依赖项的地方。在接下来的步骤中,/sysroot
路径将被打包为我们的基本映像的根目录。以这种
dnf
方式使用--installroot
选项就是我们创建其他 AL2 023 图像的方式。dnf
的一项功能使得安装程序和映像创建工具能够正常工作。 -
调用
dnf
以将软件包安装到/sysroot
。rpm -q system-release --qf '%{VERSION}'
命令会查询 (-q
)system-release
软件包,设置查询格式 (--qf
) 以打印出所查询的软件包的版本(%{VERSION}
变量是RPM
版本的rpm
变量)。通过将
dnf
的--releasever
参数设置为build
容器中的system-release
版本,每当发布更新的 Amazon Linux 容器基本映像时,都可以使用Dockerfile
来重建基本容器。可以将其设置为任何亚马逊 Linux 2023 版本,例如 2023.6.20241212。
--releasever
这样做意味着build
容器将作为最新的 023 版本运行,但无论当前的 AL2 023 版本是什么,都要从 2023.6.20241212 开始构建准系统容器。AL2--setopt=install_weak_deps=False
配置选项可告诉dnf
只安装必需 的依赖项,而不是推荐或建议的依赖项。 -
将已安装的系统复制到空白 (
FROM scratch
) 容器的根目录中。 -
在本例
/bin/bash
中,将ENTRYPOINT
设置为所需的二进制文件。
-
-
-
创建一个空目录,将步骤 2 中示例的内容添加到名为
Dockerfile
的文件中。$
mkdir al2023-barebones-bash-example
$
cd al2023-barebones-bash-example
$
cat > Dockerfile <<EOF FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as build RUN mkdir /sysroot RUN dnf --releasever=$(rpm -q system-release --qf '%{VERSION}') \ --installroot /sysroot \ -y \ --setopt=install_weak_deps=False \ install bash && dnf --installroot /sysroot clean all FROM scratch COPY --from=build /sysroot / WORKDIR / ENTRYPOINT ["/bin/bash"] EOF
-
通过运行以下命令构建容器。
$
docker build -t al2023-barebones-bash-example
-
使用以下命令运行容器,了解仅限
bash
的最小容器的运行方式。$
docker run -it --rm al2023-barebones-bash-example
bash-5.2#rpm
bash: rpm: command not found bash-5.2#du -sh /usr/
bash: du: command not found bash-5.2#ls
bash: ls: command not found bash-5.2#echo /bin/*
/bin/alias /bin/bash /bin/bashbug /bin/bashbug-64 /bin/bg /bin/catchsegv /bin/cd /bin/command /bin/fc /bin/fg /bin/gencat /bin/getconf /bin/getent /bin/getopts /bin/hash /bin/iconv /bin/jobs /bin/ld.so /bin/ldd /bin/locale /bin/localedef /bin/pldd /bin/read /bin/sh /bin/sotruss /bin/sprof /bin/type /bin/tzselect /bin/ulimit /bin/umask /bin/unalias /bin/wait /bin/zdump
举一个更实际的例子,以下过程可为显示 Hello World!
的一个 C 应用程序构建一个容器。
-
创建一个空目录并添加 C 源代码和
Dockerfile
。$
mkdir al2023-barebones-c-hello-world-example
$
cd al2023-barebones-c-hello-world-example
$
cat > hello-world.c <<EOF #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } EOF
$
cat > Dockerfile <<EOF FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as build COPY hello-world.c / RUN dnf -y install gcc RUN gcc -o hello-world hello-world.c RUN mkdir /sysroot RUN mv hello-world /sysroot/ RUN dnf --releasever=$(rpm -q system-release --qf '%{VERSION}') \ --installroot /sysroot \ -y \ --setopt=install_weak_deps=False \ install glibc && dnf --installroot /sysroot clean all FROM scratch COPY --from=build /sysroot / WORKDIR / ENTRYPOINT ["/hello-world"] EOF
-
使用以下命令构建容器。
$
docker build -t al2023-barebones-c-hello-world-example .
-
使用以下命令运行容器。
$
docker run -it --rm al2023-barebones-c-hello-world-example
Hello World!