如何使用堆栈图像容器?
堆栈可以构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