Ich war auf der Suche nach einer Antwort auf Ihre Frage, aber ironisch fand eine Frage, ich habe eine Antwort auf (wie Docker Tests schnell ausführen). Wenn Sie wirklich schnelle Tests wünschen, sollten Sie idealerweise vermeiden, den Container neu aufzubauen, wenn Sie ihn ausführen. Aber warte, wie bekomme ich den neuen Quellcode auf den Container? Volumes mein Freund, Bände. Hier ist, wie ich dies eingerichtet haben:
Docker-compose.dev.yml:
backend-test:
volumes:
- .:/path/to/myapp
Wo/path/to/myapp den Pfad im Bild ist, natürlich.
docker-compose up -f docker-compose.dev.yml
Aber jetzt, wenn Sie Ihre Tests ausführen, sind Sie nicht mehr Docker-komponieren nicht benutzen wollen, Sie gehen Docker exec verwenden: Sie werden explizit in diesem Bild für Entwickler passieren müssen:
docker exec -it backend-test go test
Wenn Sie dieses Recht tun, Sie src dir im Container Backend-Tests wird immer auf dem neuesten Stand sein, weil es in der Tat ist ein bereitgestelltes Volume. Das Anhängen an einen laufenden Container und das Ausführen von Tests sollten sich als viel schneller erweisen, als jedes Mal ein neues zu erstellen.
EDIT: Commenter richtig darauf hingewiesen, dass dies nur Neuaufbau des Bildes vermeidet, wenn Ihre Abhängigkeiten nicht geändert haben (keine Notwendigkeit go get
). Das Schöne ist, dass es nicht nur den Wiederaufbau vermeidet, sondern auch den Neustart verhindert. Wenn ich so teste, und ich eine Abhängigkeit hinzufüge, ich normalerweise nur go get
direkt von meiner Testkonsole. Es kann ein bisschen schwierig sein, go get
in Ihrem Container zu arbeiten, aber eine Möglichkeit besteht darin, Ihren ssh-Agenten durch mounting SSH_AUTH_SOCK an Ihren Container weiterzuleiten. Leider können Sie während des Builds keine Volumes bereitstellen. Daher müssen Sie möglicherweise einen Bereitstellungsschlüssel in Ihr Image einfügen, wenn das Build-Ziel vor dem Ausführen von Tests neue Abhängigkeiten abrufen soll. Der Hauptpunkt meiner Antwort war jedoch, den Build und Test zu trennen, um den vollständigen Build zu vermeiden, bis Sie bereit sind, das endgültige Artefakt zu generieren.
Das sagte, ich denke, ich könnte verstehen, dass ich die Frage nicht in der Art beantworte, wie Sie es gefragt haben. In Ruby ist die Antwort so einfach wie das Kopieren der Dateien Gemfile und Gemfile.lock und das Ausführen von bundle install --deploy
, bevor Sie den Code kopieren, den Sie geändert haben. Persönlich stört es mich nicht die Kosten für den Wiederaufbau, wenn ich Abhängigkeiten hinzufüge, da 99% meiner Änderungen immer noch keine Wiederherstellung beinhalten. Das heißt, Sie könnten den neuen von Bundan inspirierten Abhängigkeitsmanager verwenden: dep. Wenn dep installiert ist, bin ich mir ziemlich sicher, dass Sie einfach Ihre Gopkg.toml
und Gopkg.lock
in Ihr workdir kopieren, dep ensure
ausführen und dann Ihren Code kopieren können. Dadurch werden nur Abhängigkeiten gezogen, wenn Gopkg aktualisiert wurde. Anderenfalls kann docker die zwischengespeicherte Ebene mit den zuvor installierten Abhängigkeiten wiederverwenden. Entschuldigung für die lange Bearbeitung!
Wenn Sie die Abhängigkeiten "zwischenspeichern" möchten, tun Sie dies in einem Lieferantenverzeichnis, damit Sie genau wissen, welche Version Sie zwischengespeichert haben. Wenn Sie 'vendor /' nicht verwenden möchten, kopieren Sie einfach in Ihren GOPATH. – JimB
Sie könnten an [dobi] (http://dnephin.github.io/dobi/) interessiert sein, um diese Art von Aufgaben auszuführen. Compose ist eher für die Ausführung von Diensten gedacht, wobei sich dobi auf diese Art von Build-Aufgaben konzentriert. – dnephin