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

引用:
  • 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
    

    一些谷歌搜索建议在尝试在32位系统上执行64位代码时可能会出现这种情况。那可能吗?如果有关系,我在Mac OS X上。

    最佳答案

    我在本地构建的可执行文件(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,它将覆盖stack.yml中的docker设置(同样,您也不需要运行stack build separately):
    stack --docker image container
    

    关于haskell - 如何使用堆栈图像容器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38228309/

    10-12 05:54
    查看更多