Encontrou uma resposta simples aqui: link .
docker save $IMG | (eval $(minikube docker-env) && docker load)
Estou executando o minikube como um ambiente de teste local e usando construções de vários estágios do docker para criar meus contêineres. O Minikube executa uma versão do docker que não suporta builds de vários estágios. O Minikube sugere que você use o ambiente docker integrado para construir contêineres da seguinte maneira:
#!/usr/bin/env bash
eval $(minikube docker-env)
docker build
Como preciso usar a instância do docker local para criar, descobri o docker save / load. Isso significa que preciso fazer o seguinte:
#!/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
No entanto, o carregamento do docker pode ler um arquivo de stdin. Se eu pudesse canalizar a saída do meu host do docker para um host do docker remoto, eu poderia fazer isso sem modificar / poluir os ambientes dos meus usuários. Então eu estava me perguntando se havia alguma maneira de carregar o env minikube dentro de um ambiente de tubulação. Eu encontrei os seguintes trabalhos, mas é claro que ambos os hosts do docker são os mesmos:
docker save $IMG | env -i docker load
Mas eu gostaria de algo como o seguinte (código psuedo, eu acho)
docker save $IMG | env -i side_effects(eval $(minikube docker-env)) docker load
Eu tentei simplesmente inserir o comando (realmente não esperava que isso funcionasse):
docker save $IMG | env -i eval $(minikube docker-env) docker load
E fazendo uma função para carregar os valores:
function load_env { eval $(minikube docker-env) }
docker save $IMG | env -i load_env() docker load
Nem funcionou. Não tenho tanta certeza, mas presumo que a eval estava recebendo os dados enviados. E eval não usa stdin. O último causou um erro de sintaxe.
Por fim, posso fazer algo assim:
#/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
Mas, como há muitas interfaces interativas, é provável que ele comece a falhar assim que uma delas mudar.
Edit: Eu encontrei uma melhoria no acima, eu diria que é provavelmente menos frágil, mas ainda mais do que ideal:
dockerenv=$(minikube docker-env | sed 's/export//g' | sed 's/^#.*$//g' | sed 's/"//g')
docker save $IMG | env -i $dockerenv docker load
Então realmente o que estou perguntando é: existe uma maneira robusta de evitar arquivos temporários ou poluição do ambiente nas máquinas dos meus usuários? (Se alguém tiver um título melhor para essa questão, por favor altere-o - é apenas uma maneira de resolver o meu problema).
Encontrou uma resposta simples aqui: link .
docker save $IMG | (eval $(minikube docker-env) && docker load)