最小化的Swift Docker映像

断断续续的一年多来,我一直在尝试获取一个小的Swift Docker映像。

我发现小图像是有好处的,特别是在可伸缩的微服务架构中,容器不断地移动到不同的机器上,并且需要占用很小的空间并快速启动。 目前,基本的swift:4映像为1.3GB! 这使得难以在图像周围移动(推动和拉动)以及协调众多容器。

最初,四处搜寻使我进入ibmcom/swift-ubuntu-runtime ,它仅包含必要的运行时依赖项。 这是一个很大的改进,基本大小为338MB,仍然很大,但比基本Swift映像小了近4倍。

实现小图像的一种范例是静态链接容器的主要二进制文件,并将其FROM scratch放入图像中。 这可以通过许多不同的编译器来实现。 不幸的是,Swift编译器在静态链接标准库和Foundation时存在一些问题。

但是,使用Docker的多阶段构建功能并从基础Swift映像复制必要的共享库将使您拥有比IBM Swift运行时映像小的映像。

我编写了一个shell脚本,该脚本使用二进制文件的名称以及可选的输出文件的名称,该脚本使用ldd确定二进制文件使用的共享库,并将它们压缩为gzip压缩的tar文件。

使用此脚本,我能够从基本的Swift映像开始,构建二进制文件,并将依赖项和二进制文件复制到busybox映像中。

我用这种范例构建了两个图像:一个简单的print("Hello, world")程序和一个Vapor“ Hello,world”网络应用程序。 print图像为102MB,而蒸气图像为113MB,大约是ibmcom/swift-ubuntu-runtime图像的ibmcom/swift-ubuntu-runtime

希望很快就能解决静态链接,并且图像可能会更小。

快乐的Swift-ing / Docker-ing!