Docker容器中的Yesod应用程序无法发出networking请求

我有一个Yesod应用程序,我将其部署到Docker容器中的Heroku。 该应用程序使用Amazon SES发送电子邮件。 当使用yesod devel在本地运行应用程序,这工作正常,但在Heroku的容器上,我得到以下错误:

HttpExceptionRequest Request { host = "email.eu-west-1.amazonaws.com" port = 443 secure = True requestHeaders = [("Content-Type","application/x-www-form- urlencoded"),("Date","Wed, 20 Sep 2017 12:39:49 +0000"),("X-Amzn- Authorization","AWS3-HTTPS AWSAccessKeyId=AKIAIBUN4ZEOKYKOB35A, Algorithm=HmacSHA256, Signature=xh3fi4EJOAe0LOZVCng5NRZIw2D+6P++0aO4Q5Dy0gw=")] path = "/" queryString = "" method = "POST" proxy = Nothing rawBody = False redirectCount = 10 responseTimeout = ResponseTimeoutDefault requestVersion = HTTP/1.1 } (ConnectionFailure Network.BSD.getProtocolByName: does not exist (no such protocol name: tcp)) 

我想我可能需要在容器中安装一些额外的软件包。 这里是Dockerfile:

 FROM ubuntu:17.04 RUN apt-get update && apt-get install -y libpq-dev WORKDIR /app ADD . /app EXPOSE 8080 ENV PGHOST localhost CMD "./run" 

感谢Michael Snoyman的暗示,我发现netbase是填充/etc/protocols所需的软件包。 安装完成后,我收到一个新的错误,抱怨Amazon SES的SSL证书来自未知的证书颁发机构。

我安装了ca-certificates软件包,这个消失了。 我也遇到了一个错误,告诉我libstdc++6没有安装 – 所以我安装了。 现在所有的工作。

与Yesod一起使用的最终Dockerfile ,使用电子邮件authentication和Amazon SES发送电子邮件如下(“运行”命令是stack build编译的可执行文件):

 FROM ubuntu:17.04 RUN apt-get update && apt-get install -y libpq-dev libgnutls30 netbase libstdc++6 ca-certificates WORKDIR /app ADD . /app EXPOSE 8080 ENV PGHOST localhost CMD "./run" 

万岁的试错:)