如何使用堆栈图像容器?

时间:2016-07-06 15:51:16

标签: haskell docker haskell-stack

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

如何连接到以这种方式创建的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

参考文献:

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

/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上。

1 个答案:

答案 0 :(得分:6)

我在本地构建的可执行文件(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

然后我重建了,现在使用泊坞窗图像

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