
Estoy ejecutando minikube como entorno de prueba local y usando compilaciones de varias etapas de Docker para construir mis contenedores. Minikube ejecuta una versión de Docker que no admite compilaciones de varias etapas. Minikube sugiere utilizar el entorno acoplable integrado para crear contenedores de la siguiente manera:
#!/usr/bin/env bash
eval $(minikube docker-env)
docker build
Debido a que necesito usar la instancia local de Docker para compilar, encontré Docker Save/load. Esto significa que necesito hacer lo siguiente:
#!/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
Sin embargo, la carga de Docker puede leer un archivo desde la entrada estándar. Si pudiera canalizar la salida desde mi host acoplable a un host acoplable remoto, podría hacerlo sin modificar/contaminar los entornos de mis usuarios. Entonces me preguntaba si había alguna forma de cargar el entorno minikube dentro de un entorno de tubería. Encontré que lo siguiente funciona, pero, por supuesto, ambos hosts de Docker son iguales:
docker save $IMG | env -i docker load
Pero me gustaría algo como lo siguiente (psuedocódigo, supongo)
docker save $IMG | env -i side_effects(eval $(minikube docker-env)) docker load
Intenté simplemente insertar el comando (realmente no esperaba que esto funcionara):
docker save $IMG | env -i eval $(minikube docker-env) docker load
Y haciendo una función para cargar los valores:
function load_env { eval $(minikube docker-env) }
docker save $IMG | env -i load_env() docker load
Ninguno funcionó. No estoy tan seguro, pero supongo que eval estaba recibiendo los datos canalizados. Y eval no usa stdin. Este último provocó un error de sintaxis.
Finalmente, podría hacer algo como esto:
#/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
Pero como tiene muchas interfaces que interactúan, es probable que comience a fallar tan pronto como una de ellas cambie.
Editar: encontré una mejora con respecto a lo anterior, yo diría que probablemente sea menos frágil, pero aún más que ideal:
dockerenv=$(minikube docker-env | sed 's/export//g' | sed 's/^#.*$//g' | sed 's/"//g')
docker save $IMG | env -i $dockerenv docker load
Entoncesen realidadLo que pregunto es: ¿existe una forma sólida de evitar archivos temporales o contaminación ambiental en las máquinas de mis usuarios? (Si alguien tiene un título mejor para esta preguntapor favorcámbielo, es sólo una forma de resolver mi problema).
Respuesta1
Encontré una respuesta simple aquí:https://stackoverflow.com/a/44207110.
docker save $IMG | (eval $(minikube docker-env) && docker load)