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