如何使用堆栈图像容器?
How to use stack image container?
Stack 可以使用 stack image container
命令在服务器上为 运行 您的应用构建一个 docker 容器(参见下面的参考资料)。
如何连接到以这种方式创建的 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
更新:我正在四处寻找。当我附加到 运行ning 容器时,我的应用肯定不是 运行ning。如果我尝试手动执行它,我会收到以下错误:
/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 上。
我在本地构建的可执行文件 (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.yml 中的 docker 设置(而且您不需要 运行 stack build separately
):
stack --docker image container
Stack 可以使用 stack image container
命令在服务器上为 运行 您的应用构建一个 docker 容器(参见下面的参考资料)。
如何连接到以这种方式创建的 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
更新:我正在四处寻找。当我附加到 运行ning 容器时,我的应用肯定不是 运行ning。如果我尝试手动执行它,我会收到以下错误:
/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 上。
我在本地构建的可执行文件 (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.yml 中的 docker 设置(而且您不需要 运行 stack build separately
):
stack --docker image container