可以无限期地离开docker-组成运行的最小图像是什么?

What is the smallest image that can be used to leave docker-compose running indefinitely?

我的一个单元测试杀死了一个 运行 Docker 容器。为了单元测试工作,我需要用 docker-compose run 启动一个容器,这样它就有东西可以杀了。

可以与 docker-compose.yml 一起使用以实现此目的的最小和最简单的图像是什么?

请注意,Docker文件不是必需的。

您只需要一个 docker-compose 文件即可

version: '3.9'
services:
  myservice:
    image: alpine:latest
    command: tail -f /dev/null

如果您喜欢其他内容,您或许可以找到 运行 的其他图像。 nginx:alpine 突然想到。这不需要命令,因此您可以在 docker-compose 文件中保存一行。

如果您正在寻找字面上最小的图像,并且它除了不退出之外不需要做任何事情,k8s.gcr.io/pause 应该接近。

此镜像是 Kubernetes 的一部分,您可以阅读 its source。 Makefile 将小型 C 程序编译成静态二进制文件,然后将其构建成 FROM scratch 映像。这意味着它甚至不会为 BusyBox 静态二进制文件花费兆字节,因此它不包含不必要的绒毛,如 shell、tail、Alpine 的 apk 包管理器或其他任何东西完全没有。

~% docker images
REPOSITORY         TAG       IMAGE ID       CREATED        SIZE
k8s.gcr.io/pause   3.7       221177c6082a   3 weeks ago    711kB
busybox            latest    2fb6fc2d97e1   3 weeks ago    1.24MB
alpine             latest    76c8fb57b6fc   4 days ago     5.57MB

除了永远休眠之外,此图像所做的一件事是注意是否有任何子进程退出并为它们等待(2)。因为它期望进程 ID 为 1,所以这会清除所有重新成为 init 进程父级的孤立进程(委婉地说,“收割僵尸”)。 Kubernetes 使用它作为 multi-container pod 的根,其中 pods 共享各种命名空间;另请参阅 or Ian Lewis's The Almighty Pause Container(其中包括作为博客的一部分的整个 C 源代码 post)。

如果您在汇编中重写二进制文件,那么您可能会构建一个更小的映像,这样您就不需要标准样板文件来启动和停止 C 进程,但这可能不值得付出努力。