Haskell - Alpine Docker 图像中的主机名解析不起作用

Haskell - hostname resolution inside Alpine Docker image does not work

问题

我正在尝试使用 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 图片

我用于 运行 应用程序的 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

听起来您的 Haskell 代码到 运行 的某些链接依赖项似乎丢失了。

Alpine 使用 musl libc to cutdown on size which means most standard linked binaries won't run from the standard distros as they use GNU libc. Either compile your app as normal in an alpine image or create a statically linked binary to run in any Linux distro/container.

Debian 基础层在使用它的任何映像之间共享,因此在任何情况下,您可能 space 并没有像您想象的那样节省那么多。如果使用 Debian 映像会更容易,那么就使用它。

我无法在 alpine + musl libc 上安装 GHC 8.2.1。作为解决方法,我尝试使用 alpine-glibc image, but it resulted in the segfaults whenever my application tried to resolve host names. It turns out, that this is known bug in glibc.

解决方案是另外使用动态链接二进制文件+ alpine-glibc image + install gmp-dev