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

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

저는 minikube를 로컬 테스트 환경으로 실행하고 docker 다단계 빌드를 사용하여 컨테이너를 구축하고 있습니다. Minikube는 다단계 빌드를 지원하지 않는 Docker 버전을 실행합니다. Minikube는 내장된 Docker 환경을 사용하여 다음과 같이 컨테이너를 구축할 것을 제안합니다.

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

빌드하려면 로컬 docker 인스턴스를 사용해야 하기 때문에 docker save/load를 찾았습니다. 즉, 다음을 수행해야 합니다.

#!/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 환경을 로드할 수 있는 방법이 있는지 궁금했습니다. 다음 작품을 찾았지만 물론 두 도커 호스트는 모두 동일합니다.

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)

관련 정보