如何使用堆栈图像容器?

堆栈可以构build一个docker容器,以使用stack image container命令在服务器上运行您的应用程序(请参阅下面的参考资料)。

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

我已经构build了一个简单的应用程序来演示该问题。 请参阅完整的代码: 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 

但是,如果您build立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 

参考文献:

  • http://www.yesodweb.com/blog/2015/12/yesod-hosting-docker-kubernetes
  • https://github.com/commercialhaskell/stack/issues/2337
  • http://docs.haskellstack.org/en/stable/GUIDE/#docker

更新 :我正在更多。 当我连接到正在运行的容器时,我的应用程序肯定没有运行。 如果我试图手动执行它,我得到以下错误:

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

一些使用Google提示,当尝试在32位系统上执行64位代码时,可能会出现这种情况。 那可能吗? 如果有关系,我在mac osx上。

我在本地构build的可执行文件(OSX)在Docker容器上无法运行。 解决scheme是与dockerbuild设。 我改变了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 

然后我重build,现在使用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 build separately ):

 stack --docker image container