Docker-Muster für Container mit einem langen Anfangsbefehl

Docker-Muster für Container mit einem langen Anfangsbefehl

Ich möchte eine Menge lokalen und Open-Source-Code in einen Docker-Container packen, der auf Host-Rechnern verteilt wird, um ihn zu erstellen und auszuführen. Der endgültige Container soll im Befehlszeilenstil ausgeführt werden und das Ergebnis ausgeben, z. B. ( docker run cmdcontainer args). Das Problem, das ich habe, ist, dass die verteilte Quelle gezielt auf den spezifischen Host ausgerichtet und dort einmal kompiliert werden muss, auf dem sie ausgeführt wird, und das dauert Stunden. Nach der Kompilierung wird der Befehl jedoch sehr schnell ausgeführt.

Daher frage ich mich, ob es für diese Art von Arbeitsablauf ein bekanntes Docker-Muster gibt:

Docker-Container mit Quelldateien verteilen -> Container ausführen, um einen neuen Container mit kompilierten Binärdateien zu generieren -> Nachfolgende Ausführungen führen den kompilierten Container aus

Da hier grundsätzlich ein neuer Container über den alten gelegt wird, scheint dies möglich zu sein, aber ich bin ein Docker-Neuling.

Antwort1

Da jeder Host einzigartig ist, besteht die beste Lösung, die mir einfällt, in der Verwendung eines Volumes zur Persistenz. Sie benötigen den folgenden Workflow in Ihrem Einstiegspunkt:

  1. Überprüfen Sie die Version Ihres kompilierten Codes im Volume
  2. Wenn die Version nicht übereinstimmt, löschen Sie den Datenträgerinhalt
  3. Wenn die Version nicht festgelegt ist oder nicht übereinstimmt, führen Sie die Kompilierung aus
  4. Schreiben Sie die neue Versionsnummer auf dieses Volume
  5. Führen Sie Ihre App aus der kompilierten Version im Volume aus

Dies erfordert, dass Ihr Image-Build eine Versionsnummer enthält, z. B. einen Git-Hash. Sie können dies mit einem Build-Argument tun:

docker build --build-arg GIT_REV=$(git rev-parse --short HEAD) ...

Und dann würde Ihr Dockerfile etwas wie Folgendes enthalten:

ARG GIT_REV
ENV GIT_REV=${GIT_REV}

Beachten Sie, dass alle Benutzer, die ohne Volume arbeiten, bei jedem Lauf trotzdem die Kompilierung sehen.

verwandte Informationen