Haskell - Alpine Docker镜像内的主机名解析不起作用

时间:2017-11-12 00:21:21

标签: haskell docker docker-compose hostname alpine

问题

我正在尝试使用内部的Haskell应用程序创建docker镜像。但是,我的Docker容器内的应用程序中网络中其他容器的主机名的域名解析失败(但我能够wget / ping其他容器及其主机名正确解析。

要查找根本原因,我尝试手动解析主机名(使用Network.DNS包)并仅使用servant-client中的IP地址。然而,这只会产生神秘的错误信息:

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

我想我在Docker镜像中遗漏了一些包。我尝试安装libc6-compat但没有成功(Debian的libc6用于编译Haskell应用程序)。此外/etc/protocols包含正确的条目。码头图像中还缺少什么?

Docker图像

我用来运行应用程序的docker镜像是alpine:3.6 - Whole dockerfile, there's not much in it。这与用于构建应用程序的图像不同(它小约20倍)。

我用来构建haskell应用程序的docker镜像基于debian:stretchDockerfile

此处提供了包含构建说明的整个源代码(可以跳过Angular部分):

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

2 个答案:

答案 0 :(得分:2)

听起来你缺少一些链接的依赖项来运行你的Haskell代码。

Alpine使用musl libc来缩减大小,这意味着大多数标准链接二进制文件在使用GNU libc时不会从标准发行版中运行。您可以在alpine image中正常编译应用,也可以创建statically linked binary to run in any Linux distro/container

基础Debian图层在使用它的任何图像之间共享,因此您可能无法在任何情况下保存尽可能多的空间。如果它更容易使用Debian图像,那么使用它。

答案 1 :(得分:1)

我无法在alpine + musl libc上安装GHC 8.2.1。作为一种解决方法,我尝试使用alpine-glibc图像,但只要我的应用程序尝试解析主机名,就会导致段错误。 It turns out, that this is known bug in glibc.

解决方案是另外使用动态关联的二进制+ alpine-glibc图片+安装gmp-dev