Docker 容器中的 Yesod 应用程序无法发出网络请求
Yesod app in Docker container can't make network requests
我有一个 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))
我想我可能需要在容器中安装一些额外的包。这是 Docker 文件:
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
没有安装 - 所以我安装了它。现在一切正常。
我最终的 Dockerfile
与 Yesod 一起使用,使用电子邮件身份验证和 Amazon SES 发送电子邮件,如下所示("run" 命令是从 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"
试错万岁:)
我有一个 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))
我想我可能需要在容器中安装一些额外的包。这是 Docker 文件:
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
没有安装 - 所以我安装了它。现在一切正常。
我最终的 Dockerfile
与 Yesod 一起使用,使用电子邮件身份验证和 Amazon SES 发送电子邮件,如下所示("run" 命令是从 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"
试错万岁:)