2017-04-16 3 views
2

Ich möchte einen Container-Build eines Haskell-Stack-Projekts für die Arbeit einrichten. Ich weiß, dass stack --docker build existiert, aber ich möchte dies nur mit docker tun, so dass meine Kollegen nicht zuerst stack installieren müssen.Wie führe ich einen Stack-Build in einem Docker-Container aus?

ich derzeit ein Dockerfile haben, die wie folgt aussieht:

FROM fpco/stack-build:lts-8.9 
RUN mkdir -p /stack && stack --stack-root /stack setup --resolver lts-8.9 
COPY build.sh/
ENTRYPOINT ["/build.sh"] 

Und leite stack wie:

stack build --stack-root=/stack --resolver=lts-8.9 

Dies hat jedoch die folgenden Probleme:

  • es neu erstellt alle der Abhängigkeiten jedes Mal
  • es erfordert --allow-different-users, wie es zu sein scheint meine lokalen wiederverwenden .stack-work, die weniger scheint als ideal

Ich habe auch nicht herausgefunden, ob es bricht nativen Stack baut, oder Dinge wie intero.

+0

Wenn Sie Dinge in Docker zwischenspeichern möchten, benötigen Sie eine separate Zeile. https://github.com/commercialhaskell/stack/issues/694 kommt etwas näher. – Reactormonk

Antwort

0

Ich habe in der Regel eine volumes Abschnitt in einer begleitenden docker-compose.yml Datei, die das .stack-work Verzeichnis in den Container montiert. Verwenden Sie dann in dem Skript, das in dem ENTRYPOINT von Dockerfile referenziert wird, stack install statt stack build.

Meine docker-compose.yml Datei könnte etwa so aussehen, wo die backend Ordner meinem lokalen .stack-work Verzeichnis enthält:

version: "2" 
services: 
    backend: 
    build: ./docker-containers/backend 
    tty: true 
    stdin_open: true 
    volumes: 
     - ./backend:/home/dev/backend 
     - ./.local:/root/.local 
0

Meine Lösung folgt.

Das Docker-Image für Build hat kein Stack-Setup.

FROM fpco/stack-build:lts-9.14 
ADD ./build.sh /bin/ 
ENTRYPOINT ["build.sh"] 

Führen Sie die Stapeleinrichtung unter biuld.sh aus.

stack setup --resolver=lts-9.14 --allow-different-user 
stack build --allow-different-user 

Projektverzeichnis und Stackstammverzeichnis zur Laufzeit vom Host laden.

docker run -w /workspace -v ~/myproject:/workspace -v ~/.stack:/root/.stack 
Verwandte Themen