Haskell – Alpine Docker映像中的主机名parsing不起作用

问题

我正在尝试在Haskell应用程序里面创builddocker镜像。 然而,在我的应用程序内的泊坞窗容器networking中的其他容器的主机名的域名parsing失败(但我能够wget / ping其他容器和他们的主机名正确解决)。

为了find根本原因,我尝试手动parsing主机名(使用Network.DNS包),并只使用servant-client IP地址。 但是,这只会产生一个神秘的错误信息:

Network.BSD.getProtocolByName: does not exist (no such protocol name: udp)

我想我错过了我的泊坞窗图像中的一些包。 我试过安装libc6-compat但没有成功(Debian的libc6被用来编译Haskell应用程序)。 而且/etc/protocols包含正确的条目。 docker图像里还有什么东西丢失?

Docker镜像

我用来运行应用程序的docker图像是alpine:3.6 – 整个docker文件,没有太多 。 这是用来构build应用程序的不同的图像(它是大约20倍)。

我用来构buildhaskell应用程序的docker镜像基于debian:stretch 。 Dockerfile 。

带有构build指令的整个源代码可以在这里find(angular部分可以跳过):

https://github.com/carbolymer/blockchain/tree/0b041875f71b2a09dc8568ee7b0cc22460fd5624

这听起来像你缺lessHaskell代码运行的一些链接依赖项。

Alpine使用musl libc来缩减大小,这意味着大多数标准的链接二进制文件不会从标准发行版运行,因为它们使用GNU libc 。 在高山图像中正常编译您的应用程序,或创build一个静态链接的二进制文件在任何Linux发行版/容器中运行 。

基本的Debian层是在任何使用它的图像之间共享的,所以在任何情况下你都不会节省太多的空间。 如果使用Debian镜像会更容易,那就使用它。

我无法安装GHC 8.2.1高山+ musl libc。 作为一种解决方法,我尝试使用alpine-glibc映像,但每当我的应用程序尝试parsing主机名时,都会导致段错误。 事实certificate,这是glibc中的已知错误。

解决方法是使用dynamic链接二进制+ 阿尔卑斯山glibc图像+安装gmp-dev另外。