ไม่สามารถเขียนไฟล์ / etc / hosts จาก Dockerfile ด้วย RUN


9

ฉันสร้างภาพนักเทียบท่าโดยใช้ Dockerfile ที่เรียบง่าย ข้างใน Dockerfile ฉันมีคำสั่งนี้:

RUN printf "192.92.13.243 www.hahaha.com \n" >> /etc/hosts

คำสั่งนั้นดูเหมือนจะโอเคเนื่องจากการสร้างอิมเมจไม่ได้หยุดอยู่ที่จุดนี้

ปัญหาคือ: เมื่อเรียกใช้รูปภาพเส้นที่ควรแทรกภายใน "/ etc / hosts" ไม่มีอยู่

ตอนนี้ฉันค้นหาไปรอบ ๆ และพบว่าก่อนหน้านักเทียบท่ารุ่น 1.2 มีปัญหากับไฟล์โฮสต์ภายในคอนเทนเนอร์ ในกรณีของฉันฉันใช้เวอร์ชัน 1.5 ซึ่งเป็นเวอร์ชั่นล่าสุด ณ ขณะนี้

ฉันพลาดอะไรไปรึเปล่า?

อัปเดต 1:

ดูเหมือนจะมีปัญหามากมายสำหรับเรื่องนี้ทั้งเปิดและปิดในหน้า github ของนักเทียบท่า

คำตอบ:


12

สิ่งนี้ใช้ได้กับนักเทียบท่า 1.7.0

RUN echo "192.168.11.112 myhost" >> /etc/hosts && wget http://myhost

เคล็ดลับคือการเพิ่มชื่อโฮสต์ในบรรทัดเดียวกับที่คุณใช้มิฉะนั้นไฟล์โฮสต์จะได้รับการรีเซ็ตเนื่องจากคำสั่ง RUN ทุกคำสั่งจะเริ่มต้นคอนเทนเนอร์กลางใหม่ ตัวอย่างเช่นสิ่งนี้จะไม่ทำงาน :

RUN echo "192.168.11.112 myhost" >> /etc/hosts
RUN wget http://myhost

1
ขอบคุณสำหรับความเข้าใจ! แม้ว่าถูกต้อง (ฉันตรวจสอบแล้ว) และมีประโยชน์โดยทั่วไป แต่ก็ไม่มีประโยชน์สำหรับฉันในกรณีนี้ ฉันต้องการไฟล์ "เจ้าภาพ" ที่จะบรรจุเมื่อคอนเทนเนอร์ทำงาน
dlyk1988

2
+1 สำหรับการเรียกใช้คำสั่งในบรรทัดเดียวกัน
myol

7

หลังจากเขียนการอัปเดตไปยังคำถามของฉันฉันตัดสินใจที่จะพิจารณาเรื่อง "ปัญหา" ที่เปิดขึ้นใน GitHub อีกครั้ง กลับกลายเป็นว่ามีการใช้วิธีแก้ปัญหา:

docker run ... --add-host='server:0.0.0.0' ...

ใช้อาร์กิวเมนต์ "--add-host ... " เมื่อเริ่มต้นคอนเทนเนอร์เป็นไปได้ที่จะแก้ไขไฟล์โฮสต์


5
ฉันต้องการที่จะสามารถทำได้ในการสร้างแม้ว่า คนที่ใช้ภาชนะไม่ควรรู้เกี่ยวกับโฮสต์ภายใน ทำให้รู้สึกเป็นศูนย์!
samsamm777

ฉัน echo @ samsamm777 สงสัยว่ามีวิธีที่ดีในการทำเช่นนั้น?
Jonathan

นี่เป็นพฤติกรรมที่น่าประหลาดใจมากซึ่งไม่เคยเป็นความคิดที่ดีในระบบไอทีเลย
Torsten Bronger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.