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上。
答案 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