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
그래서 정말 내가 부탁 해요 것입니다 내 사용자의 컴퓨터에서 임시 파일이나 환경 오염을 방지 할 수있는 강력한 방법이? (누군가가이 질문에 대한 더 나은 제목이있는 경우 하시기 바랍니다 - 그것을 변경 내 문제를 해결하는 하나의 방법이있다).
echo "blah" | (eval $(touch side_effect) && tr -d '\n')