Como efetuar efeitos colaterais no tubo

Como efetuar efeitos colaterais no tubo

Estou executando o minikube como um ambiente de teste local e usando compilações de vários estágios do docker para construir meus contêineres. O Minikube executa uma versão do docker que não oferece suporte a compilações de vários estágios. 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 local do docker para construir, encontrei 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, docker load pode ler um arquivo do stdin. Se eu pudesse canalizar a saída do meu host docker para um host docker remoto, poderia fazer isso sem modificar/poluir os ambientes dos meus usuários. Então, eu queria saber se havia alguma maneira de carregar o ambiente do minikube em um ambiente de pipe. Encontrei os seguintes trabalhos, mas é claro que os dois hosts do docker são iguais:

docker save $IMG | env -i docker load

Mas eu gostaria de algo como o seguinte (psuedo-código, eu acho)

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

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

Nenhum dos dois funcionou. Não tenho certeza, mas presumo que eval estava recebendo os dados canalizados. E eval não usa stdin. Este último causou um erro de sintaxe.

Finalmente, eu poderia 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 tem muitas interfaces interativas, provavelmente começará a falhar assim que uma delas mudar.

Editar: encontrei uma melhoria acima, diria que é provavelmente menos frágil, mas ainda mais do que o ideal:

dockerenv=$(minikube docker-env | sed 's/export//g' | sed 's/^#.*$//g' | sed 's/"//g')
docker save $IMG | env -i $dockerenv docker load

Entãorealmenteo que estou perguntando é: existe uma maneira robusta de evitar arquivos temporários ou poluição ambiental nas máquinas dos meus usuários? (Se alguém tiver um título melhor para esta perguntapor favormude- é apenas uma maneira de resolver meu problema).

Responder1

Encontrei uma resposta simples aqui:https://stackoverflow.com/a/44207110.

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

informação relacionada