นักเทียบท่า ENV เทียบกับการส่งออก RUN


95

สมมติว่าฉันต้องการรวมคำสั่งเหล่านี้

RUN command_1
ENV FOO bar
RUN command_2

เป็น

RUN command_1 && export FOO=bar && command_2

และสงสัยว่าการตั้งค่าตัวแปรด้วยRUN exportvs ENVเทียบเท่ากันหรือไม่

กล่าวอีกนัยหนึ่งคำสั่งเหล่านี้ใน Dockerfile แตกต่างกันหรือไม่?

ENV FOO bar

เทียบกับ

RUN export FOO=bar

คำตอบ:


155

ในฐานะที่เป็นภาพประกอบโดยปัญหา 684 , exportจะไม่คงอยู่ทั่วทั้งภาพ (อย่าลืมว่าคำสั่ง Dockerfile แต่ละคำสั่งจะสร้างคอนเทนเนอร์ระดับกลางโดยผูกมัดเป็นรูปภาพกลางรูปภาพนั้นจะไม่รักษาค่าที่ส่งออก)
ENVจะ:

ตัวแปรสภาพแวดล้อมที่ตั้งค่าโดยใช้ENVจะยังคงมีอยู่เมื่อคอนเทนเนอร์ถูกเรียกใช้จากรูปภาพที่เป็นผลลัพธ์
คุณสามารถดูค่าใช้และเปลี่ยนพวกเขาโดยใช้docker inspectdocker run --env <key>=<value>

ปัญหานี้แสดงให้เห็นด้วย:

RUN export PATH=$PATH:/foo/bar # from directly in builder

เมื่อผมทำมันไม่เคยมีdocker run [img] bash -c 'echo $PATH'/foo/bar

ลองมัน

สร้าง Dockerfile ใหม่ที่มี:

FROM centos:6
ENV FOO=foofoo
RUN export BAR=barbar
RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"

จากนั้นสร้างมัน ผลลัพธ์ของขั้นตอนสุดท้ายคือ:

Step 4/4 : RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"
 ---> Running in eb66196b238d
foofoo  bazbaz

คุณสามารถดู:

  • FOOคงอยู่ผ่านคอนเทนเนอร์กลางขอบคุณENVคำสำคัญ;
  • BARไม่คงอยู่ในขั้นตอนต่อไปเนื่องจากexportคำสั่ง
  • BAZ แสดงอย่างถูกต้องเนื่องจากใช้ตัวแปรบนคอนเทนเนอร์เดียวกัน

(ฉันเดาว่าใช่ แต่ :) หมายความว่าdockerเช่นrunมี--env-fileหรือ--envจะส่งออกตัวแปรเหล่านั้น (โดยอาร์กิวเมนต์ตัวเลือกเหล่านี้) ขออภัยที่ทำให้เกิดความสับสนกับคำตอบเก่า ๆ เช่นนี้ แต่ผู้ค้นหาเว็บเพิ่งแจ้งให้ฉันทราบ คำตอบที่ดี btw.
hakre

@hakre ใช่สิ่งเหล่านี้ถูกผนวกเข้ากับสภาพแวดล้อม: ดูstackoverflow.com/a/49872152/6309และด้านล่าง
VonC

ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว แต่คำตอบนั้นไม่ได้แสดงว่ามีการทำเครื่องหมายตัวแปรเพื่อส่งออก อย่างน้อยก็ไม่ใช่สำหรับฉัน อย่างไรก็ตามผมควรจะทำบ้านของตัวเองที่นี่เช่นsuperuser.com/q/450868/63279หรือpubs.opengroup.org/onlinepubs/9699919799/utilities/...
hakre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.