如何使用堆栈图像容器?

How to use stack image container?

Stack 可以使用 stack image container 命令在服务器上为 运行 您的应用构建一个 docker 容器(参见下面的参考资料)。

如何连接到以这种方式创建的 docker 容器中的 Web 服务器?

我构建了一个简单的应用程序来演示该问题。在此处查看完整代码:https://github.com/seanhess/haskell-docker-example

此应用是在 stack new 的基础上构建的,仅作了极小的改动。这里是 Main.hs

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Network.Wai
import Network.HTTP.Types (status200)
import qualified Network.Wai.Handler.Warp as Warp

main :: IO ()
main = Warp.run 8010 app

app :: Application
app req respond = do
    (putStrLn $ "Request: " ++ (show req))
    (respond $ responseLBS status200 [] "Hello World")

和stack.yaml

resolver: nightly-2016-06-12

image:
  container:
    name: haskell-docker-example
    base: fpco/stack-run

如果您在本地 运行,此应用会以 "Hello world" 响应。

stack build
stack exec haskell-docker-example

但是如果您构建 docker 映像并启动它:

stack image container
docker run -it -p 8010:8010 haskell-docker-example

请求到达 docker 容器,但我们收到空响应错误,因为它后面没有任何内容。

$ curl -i http://localhost:8010
curl: (52) Empty reply from server

参考文献:

更新:我正在四处寻找。当我附加到 运行ning 容器时,我的应用肯定不是 运行ning。如果我尝试手动执行它,我会收到以下错误:

/usr/local/bin/haskell-docker-example-exe
bash: /usr/local/bin/haskell-docker-example-exe: cannot execute binary file: Exec format error

一些谷歌搜索表明在 32 位系统上尝试执行 64 位代码时可能会出现这种情况。那可能吗?如果这很重要,我会在 mac osx 上。

我在本地构建的可执行文件 (OSX) 在 docker 容器上 运行 不可用。解决方案是使用 docker 构建。我将 stack.yaml 更改为以下内容:

# we have to switch to an LTS resolver, because the stack-build
# docker image doesn't support nightly. 
resolver: lts-6.6

docker:
  enable: true

image:
  container:
    name: haskell-docker-example
    base: fpco/stack-run

然后我重建,现在使用 docker 图像

stack build
stack image container

运行太棒了!看起来您需要手动指定您想要 运行 可执行文件:

docker run -it -p 8010:8010 haskell-docker-example /usr/local/bin/haskell-docker-example-exe

或者,运行 与 --docker 叠加,这将覆盖 stack.yml 中的 docker 设置(而且您不需要 运行 stack build separately):

stack --docker image container