
Ich verwende Minikube als lokale Testumgebung und verwende Docker-Multistage-Builds zum Erstellen meiner Container. Minikube führt eine Docker-Version aus, die Multistage-Builds nicht unterstützt. Minikube schlägt vor, dass Sie die integrierte Docker-Umgebung zum Erstellen von Containern wie folgt verwenden:
#!/usr/bin/env bash
eval $(minikube docker-env)
docker build
Da ich zum Erstellen die lokale Docker-Instanz verwenden muss, habe ich Docker Save/Load gefunden. Das bedeutet, dass ich Folgendes tun muss:
#!/usr/bin/env bash
docker build
docker save $IMG > /tmp/container.tar
eval $(minikube docker-env) # set up docker env vars
docker load -i /tmp/container.tar
eval $(minikube docker-env -u) # clean up env
Docker Load kann jedoch eine Datei von stdin lesen. Wenn ich die Ausgabe von meinem Docker-Host an einen Remote-Docker-Host weiterleiten könnte, könnte ich dies tun, ohne die Umgebungen meiner Benutzer zu ändern/verunreinigen. Daher habe ich mich gefragt, ob es eine Möglichkeit gibt, die Minikube-Umgebung innerhalb einer Pipe-Umgebung zu laden. Ich habe festgestellt, dass Folgendes funktioniert, aber natürlich sind beide Docker-Hosts gleich:
docker save $IMG | env -i docker load
Aber ich hätte gerne so etwas wie das Folgende (Pseudocode, schätze ich)
docker save $IMG | env -i side_effects(eval $(minikube docker-env)) docker load
Ich habe versucht, einfach den Befehl einzufügen (habe nicht wirklich damit gerechnet, dass das funktioniert):
docker save $IMG | env -i eval $(minikube docker-env) docker load
Und erstellen Sie eine Funktion zum Laden der Werte:
function load_env { eval $(minikube docker-env) }
docker save $IMG | env -i load_env() docker load
Beides hat nicht funktioniert. Ich bin mir nicht so sicher, aber ich nehme an, dass eval die weitergeleiteten Daten empfangen hat. Und eval verwendet nicht stdin. Letzteres hat einen Syntaxfehler verursacht.
Schließlich könnte ich so etwas tun:
#/usr/bin/env bash
hostenv=$(minikube docker-env | grep DOCKER_HOST | cut -f2 -d'='
certpath=$(minikube docker-env | grep DOCKER_CERT_PATH | cut -f2 -d'='
docker save $IMG | docker -H=$hostenv --tls=true --tlsverify=true \
--tlscacert=$certpath/ca.pem --tlscert=$certpath/cert.pem \
--tlskey=$certpath/key.pem
Da es sich jedoch um viele interagierende Schnittstellen handelt, treten wahrscheinlich Fehler auf, sobald sich eine dieser Schnittstellen ändert.
Bearbeiten: Ich habe eine Verbesserung zum oben genannten gefunden. Ich würde sagen, sie ist wahrscheinlich weniger fragil, aber immer noch mehr als ideal:
dockerenv=$(minikube docker-env | sed 's/export//g' | sed 's/^#.*$//g' | sed 's/"//g')
docker save $IMG | env -i $dockerenv docker load
AlsoWirklichwas ich frage ist: Gibt es eine robuste Möglichkeit, temporäre Dateien oder Umweltverschmutzung auf den Rechnern meiner Benutzer zu vermeiden? (Wenn jemand einen besseren Titel für diese Frage hatBitteändern Sie es – das ist die einzige Möglichkeit, mein Problem zu lösen).
Antwort1
Habe hier eine einfache Antwort gefunden:https://stackoverflow.com/a/44207110.
docker save $IMG | (eval $(minikube docker-env) && docker load)