Como efetuar efeitos colaterais no tubo

2

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).

    
por mkingston 21.06.2017 / 15:07

1 resposta

1

Encontrou uma resposta simples aqui: link .

docker save $IMG | (eval $(minikube docker-env) && docker load)

    
por 22.10.2017 / 19:56