วิธีการผลข้างเคียงในท่อ


2

ฉันใช้ 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

ดังนั้น จริงๆ สิ่งที่ฉันถามคือ: มีวิธีที่มีประสิทธิภาพในการหลีกเลี่ยงไฟล์ชั่วคราวหรือมลพิษทางสิ่งแวดล้อมในเครื่องของผู้ใช้หรือไม่? (ถ้าใครมีชื่อที่ดีกว่าสำหรับคำถามนี้ โปรด เปลี่ยนเป็นวิธีเดียวที่จะแก้ปัญหาของฉัน)

คำตอบ:


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.