ฉันใช้ minikube เป็นสภาพแวดล้อมการทดสอบในท้องถิ่นและใช้การสร้างหลายขั้นตอนของ docker เพื่อสร้างคอนเทนเนอร์ของฉัน Minikube เรียกใช้เวอร์ชันของนักเทียบท่าที่ไม่รองรับการสร้างหลายขั้นตอน Minikube แนะนำให้คุณใช้สภาพแวดล้อม docker ในตัวเพื่อสร้างคอนเทนเนอร์ดังนี้:
#!/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
อย่างไรก็ตามโหลดนักเทียบท่าสามารถอ่านไฟล์จาก stdin ได้ ถ้าฉันสามารถไพพ์เอาท์พุทจาก host docker ของฉันไปยัง host docker รีโมตฉันสามารถทำได้โดยไม่ต้องแก้ไข / สร้างมลภาวะสภาพแวดล้อมของผู้ใช้ ดังนั้นฉันจึงสงสัยว่ามีวิธีในการโหลด minikube env ภายในสภาพแวดล้อมของท่อหรือไม่ ฉันพบงานต่อไปนี้แล้ว แต่แน่นอนว่าโฮสต์ทั้งนักเทียบท่านั้นเหมือนกัน:
docker save $IMG | env -i docker load
แต่ฉันต้องการสิ่งต่อไปนี้ (psuedo-code ฉันเดา)
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 กำลังรับข้อมูล pip และ 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')