2016-07-06 19 views
3

Stack kann einen Andock-Container erstellen, um Ihre App auf einem Server mit dem Befehl stack image container auszuführen (siehe Referenzen unten).Wie wird der Stapelbildcontainer verwendet?

Wie stelle ich eine Verbindung zum Webserver im so erstellten Andock-Container her?

Ich habe eine einfache App gebaut, um das Problem zu demonstrieren. Sehen Sie den vollständigen Code hier: https://github.com/seanhess/haskell-docker-example

Diese App wurde von stack new mit minimalen Änderungen gebaut. Hier ist 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") 

Und stack.yaml

resolver: nightly-2016-06-12 

image: 
    container: 
    name: haskell-docker-example 
    base: fpco/stack-run 

Diese App antwortet mit "Hallo Welt", wenn Sie es lokal ausgeführt.

stack build 
stack exec haskell-docker-example 

Aber wenn Sie das Docker Bild bauen und starten Sie es:

stack image container 
docker run -it -p 8010:8010 haskell-docker-example 

ersucht den Docker Behälter zu erreichen, aber wir bekommen eine leere Antwort Fehler, weil es nichts dahinter steckt.

$ curl -i http://localhost:8010 
curl: (52) Empty reply from server 

Referenzen:

aktualisieren: Ich bin um mehr Stossen. Wenn ich den laufenden Container anhefte, wird meine App definitiv nicht ausgeführt. Wenn ich es von Hand auszuführen versuchen, erhalte ich folgende Fehlermeldung:

/usr/local/bin/haskell-docker-example-exe 
bash: /usr/local/bin/haskell-docker-example-exe: cannot execute binary file: Exec format error 

Einige googeln dies legt nahe kommen können, wenn sie versuchen, 64-Bit-Code auszuführen, auf einem 32-Bit-System. Ist das möglich? Wenn es darauf ankommt, bin ich auf Mac OSX.

Antwort

5

Die ausführbare Datei, die ich lokal erstellte (OSX), konnte auf dem Andock-Container nicht ausgeführt werden. Die Lösung war mit Docker zu bauen. Ich wechselte auf die folgende 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 

Dann wieder aufgebaut ich jetzt das Bild Docker mit

stack build 
stack image container 

Und es läuft sehr gut! Sieht aus wie Sie manuell angeben müssen, dass Sie die ausführbare Datei ausführen möchten aber:

docker run -it -p 8010:8010 haskell-docker-example /usr/local/bin/haskell-docker-example-exe 

Alternativ laufen Stapel mit --docker, die die Docker Einstellung in stack.yml außer Kraft setzen (auch Sie müssen stack build separately nicht laufen):

stack --docker image container 
Verwandte Themen