2016-07-27 9 views
2

Ich habe eine Dockerfile, die FROM golang:1.6-alpine ist. Ich möchte den Docker-Bilder-Cache so oft wie möglich verwenden, während ich docker build ausführe, um die Dinge zu beschleunigen.Beschleunigen Docker bauen für Golang Vendoring

Dafür dachte ich, ich würde ADD vendor /go/src/…/mypackage/vendor als einer der ersten Schritte hinzufügen und schließlich go install -v …/mypackage ausführen. Dies führt jedoch dazu, dass die vendored-Pakete (die den Großteil der Build-Zeit ausmachen) nur dann erstellt werden.

Gibt es trotzdem explizit zu bauen alle vendored Pakete (d. H. Quellen in einem Dir), aber nur sie?

würde ich meine Dockerfile mag so etwas wie folgt aussehen:

FROM golang:1.6-alpine 

ADD vendor /go/src/github.com/myuser/package/vendor 
# missing: magic command to build only the vendored packages above 

ADD *.go /go/src/github.com/myuser/package 
RUN go install -v "github.com/myuser/package 
+1

Sie könnten alles installieren und die Build-Artefakte für Ihr Paket entfernen. – JimB

+1

AFAIK 'go install' kompiliert alle Pakete und speichert sie nach' $ GOPATH/pkg'. So können Sie 'go install' in einem sauberen' $ GOPATH' ausführen und diese Dateien kopieren. Leider habe ich jetzt keine Zeit, dies zu überprüfen. – svenwltr

+0

Sie können auch Ihr eigenes Basisimage aus den Herstellerpaketen erstellen und die Benutzerimages von diesem erweitern. Wie bereits erwähnt, können Sie in Ihrem Basisbild eine Bereinigung usw. vornehmen. Dies würde es möglich machen, später, wenn nötig, ein sauberes Build zu erstellen und trotzdem das Vendor (Base) Image wiederzuverwenden. – ldg

Antwort

2
  • In dem Host (außerhalb des Docker-Container), werden die Pakete noch in der /vendor-Ordner gespeichert. Dies ermöglicht eine bequeme Verwaltung dieser Abhängigkeiten. Persönlich verwende ich godep, um dies zu verwalten.
  • Innerhalb des Containers, anstatt den Ordner /vendor hinzuzufügen, um ein Unterverzeichnis meines Pakets zu sein, füge ich alle Pakete innerhalb des /vendor Ordners unter dem Quellverzeichnis /go/src direkt hinzu.
  • Da es bei go's vendoring darum geht, Importpfade zu ändern, und Build-Artefakte im Verzeichnis /pkg gespeichert sind, unabhängig davon, ob sie 'vendored' sind oder nicht, ist diese Lösung stabil.
  • Um die Beschleunigung zu genießen, und nicht alle vendored Pakete neu zu erstellen, wenn sie geändert wurden, führt die Dockerfile eine go install ./... auf dem src Verzeichnis nach dem Hinzufügen der vendor Ordner, dann fährt mit dem Rest des Builds.

Dockerfile:

FROM golang:1.6-alpine 

# Add and install all vendored packages. 
ADD vendor /go/src/ 
RUN cd /go/src && go install -v ./... 

# ... 

# Add and install our package's source files, without the vendor folder 
ADD *.go "/go/src/github.com/myuser/mypackage" 
RUN go install -v "/go/src/github.com/myuser/mypackage"