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
另外。