파이프에서 부작용을 일으키는 방법


2

minikube를 로컬 테스트 환경으로 실행하고 docker multi-stage 빌드를 사용하여 컨테이너를 빌드합니다. Minikube는 다단계 빌드를 지원하지 않는 도커 버전을 실행합니다. Minikube는 내장 도커 환경을 사용하여 다음과 같이 컨테이너를 빌드 할 것을 제안합니다.

#!/usr/bin/env bash
eval $(minikube docker-env)
docker build

로컬 도커 인스턴스를 사용하여 빌드해야하므로 도커 저장 /로드를 찾았습니다. 이것은 다음을 수행해야 함을 의미합니다.

#!/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는 stdin에서 파일을 읽을 수 있습니다. 도커 호스트의 출력을 원격 도커 호스트로 파이프 할 수 있다면 사용자 환경을 수정 / 오염시키지 않고이 작업을 수행 할 수 있습니다. 그래서 파이프 환경 내에서 minikube env를로드 할 수있는 방법이 있는지 궁금했습니다. 나는 다음과 같은 작품을 발견했지만 물론 두 도커 호스트는 동일합니다.

docker save $IMG | env -i docker load

하지만 다음과 같은 것을 원합니다 (의사 코드, 추측합니다)

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

나는 단순히 명령을 삽입하려고 시도했다 (실제로 이것이 작동 할 것으로 기대하지는 않았다) :

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

그리고 값을로드하는 함수 만들기 :

function load_env { eval $(minikube docker-env) }
docker save $IMG | env -i load_env() docker load

둘 다 일하지 않았다. 확실하지 않지만 eval이 파이프 데이터를 수신하고 있다고 가정합니다. 그리고 eval은 stdin을 사용하지 않습니다. 후자는 구문 오류를 일으켰습니다.

마지막으로 다음과 같이 할 수 있습니다.

#/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

그러나 여기에는 상호 작용하는 인터페이스가 많으므로 인터페이스 중 하나가 변경 되 자마자 실패 할 수 있습니다.

편집 : 위의 개선 사항을 찾았습니다. 깨지기 쉽지는 않지만 여전히 이상적이라고 주장합니다.

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

그래서 정말 내가 부탁 해요 것입니다 내 사용자의 컴퓨터에서 임시 파일이나 환경 오염을 방지 할 수있는 강력한 방법이? (누군가가이 질문에 대한 더 나은 제목이있는 경우 하시기 바랍니다 - 그것을 변경 내 문제를 해결하는 하나의 방법이있다).

답변:


1

https://stackoverflow.com/a/44207110 에서 간단한 답변을 찾으십시오 .

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


내 질문을 다시 읽으면 타이틀의 목표를 벗어난 것이 무엇인지 믿을 수 없습니다. 내가 어떤 상태에 있었습니까? 어쨌든 누군가 이것이 최소한으로 작동하는지 테스트하고 싶다면 다음이 도움이 될 것입니다.echo "blah" | (eval $(touch side_effect) && tr -d '\n')
mkingston
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.