使用Docker的Swift

我喜欢服务器端开发,也喜欢Swift,因此很显然我对服务器端Swift感兴趣。 但是如果没有Docker,现代的后端开发是不可能的(至少是极其混乱的)。

幸运的是,我们能够在Docker容器中运行Swift应用程序。 Swift的常规Dockerfile通常看起来像:

 来自swift:latest 
添加。 / app
WORKDIR / app
运行快速包解析
RUN快速构建-配置发布EXPOSE 8080
ENTRYPOINT .build / release / SwiftDocker

这是简单明了的示例。 但不幸的是,结果容器将很大,约为1.35G。 这使得处理图像变得困难。 至少我的Mac上只有250G,因此我必须处理此问题。

Docker支持多阶段映像。 当您在一个图像中构建某些内容并将其复制到另一个图像中时。 它提供了在完整映像中构建应用程序的可能性,但仅使用最小映像即可运行它:OS +必要的库。

我总是在Golang应用程序中使用这种技术。 Go编译器能够创建一个包含所有依赖项的可执行文件。 不幸的是,Swift编译器在静态链接标准库和Foundation时存在一些问题。

我在本文“最小化Swift Docker映像”中找到了可能的解决方案。

但是直接从文章解决方案对我没有用。 所以我修改了它。 主要思想是使用ldd确定哪些共享库需要二进制文件并将其压缩到存档中。

  #!/ bin / bash 
BIN =“ $ 1”
OUTPUT_TAR =“ $ {2:-swift_libs.tar.gz}”
TAR_FLAGS =“ hczvf”
DEPS = $(ldd $ BIN | awk'BEGIN {ORS =“”} $ 1 \
〜/ ^ \ // {print $ 1} $ 3〜/ ^ \ // {print $ 3}'\
| sed's /,$ / \ n /')
焦油$ TAR_FLAGS $ OUTPUT_TAR $ DEPS

上面发布的脚本我没有做任何更改,它可以正常工作。

和Dockerfile:

 来自swift:latestADD。  / app 
WORKDIR / appRUN swift软件包解析
运行swift build --configuration releaseCOPY pkg-swift-deps.sh / usr / bin / pkg-swift-deps
运行chmod + x / usr / bin / pkg-swift-deps
运行pkg-swift-deps .build / release / SwiftDockerFROM busybox:glibcCOPY --from = 0 app / swift_libs.tar.gz /tmp/swift_libs.tar.gz
COPY --from = 0 app / .build / release / SwiftDocker / usr / bin / RUN tar -xzvf /tmp/swift_libs.tar.gz && \
rm -rf / tmp / * CMD [“ SwiftDocker”]

我想,很明显。 大概除了行

 运行chmod + x / usr / bin / pkg-swift-deps 

没有这一行,Docker无法运行脚本,我们必须指出它是可执行的。

最终图像只有62.4MB。 与1.35G相比,这是一个巨大的胜利!

您可以在Github上找到完整的项目。

我打算继续使用服务器端Swift进行实验,这是一个很好的起点。

感谢Lars-JørgenKristiansen和Jeremy Jacobson我用他们的文章创建了我的)