วิธีอัปเดตไฟล์ / etc / hosts ในอิมเมจ Docker ระหว่าง "สร้างนักเทียบท่า"


107

ฉันต้องการอัปเดต/etc/hostsไฟล์ของฉันในระหว่าง "Docker build"

ฉันเพิ่มบรรทัดด้านล่างใน Dockerfile แต่ไม่มีการอัปเดต/etc/hostsไฟล์หรือให้ข้อผิดพลาดใด ๆ

RUN echo "192.168.33.11    mynginx" >> /etc/hosts

/etc/hostsฉันจำเป็นต้องปรับปรุง ใครสามารถแนะนำเกี่ยวกับเรื่องนี้?


คุณใช้ boot2docker เพื่อเรียกใช้งาน Docker build หรือไม่?
VonC

ไม่ฉันใช้ Docker 1.8 เวอร์ชัน Linux
Prakash

1
และเมื่อคุณเรียกใช้อิมเมจของคุณเป็นคอนเทนเนอร์ / etc / hosts จะไม่เปลี่ยนแปลง? หรือคุณอ้างถึงโฮสต์ Linux / etc / hosts ของคุณ?
VonC

4
ในระหว่างการสร้างอิมเมจ Docker build สำเร็จ แต่เมื่อฉันรันคอนเทนเนอร์โดยใช้อิมเมจเดียวกันและฉันตรวจสอบไฟล์ / etc / hosts การเปลี่ยนแปลงก็ไม่อยู่ที่นั่น
Prakash

คำตอบ:


141

ด้วยเวอร์ชันล่าสุดของนักเทียบท่าสามารถทำได้โดยใช้นักเทียบท่าเขียนและextra_hostsคำสั่ง

เพิ่มการแมปชื่อโฮสต์
ใช้ค่าเดียวกับพารามิเตอร์docker runไคลเอนต์--add-host (ซึ่งควรมีให้สำหรับนักเทียบท่า 1.8 แล้ว)

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

กล่าวโดยย่อ: ปรับเปลี่ยน/etc/hostsคอนเทนเนอร์ของคุณเมื่อเรียกใช้ไม่ใช่การสร้างคอนเทนเนอร์


ด้วย Docker 17.x + คุณได้docker build --add-hostกล่าวถึงด้านล่างแต่ตามที่แสดงความคิดเห็นในปัญหา 34078และในคำตอบนี้ :

--add-hostคุณลักษณะในระหว่างการสร้างถูกออกแบบมาเพื่อช่วยให้เอาชนะเจ้าภาพในระหว่างการสร้าง แต่ไม่ได้ที่จะยังคงมีการตั้งค่าที่อยู่ในภาพ

โซลูชันที่กล่าวถึงอ้างถึงนักเทียบท่าที่ฉันแนะนำข้างต้น:

  • เรียกใช้ DNS ภายใน คุณสามารถตั้งค่าเซิร์ฟเวอร์ DNS เริ่มต้นเพื่อใช้ใน daemon วิธีนี้ทุกคอนเทนเนอร์ที่เริ่มต้นจะใช้ DNS ที่กำหนดโดยค่าเริ่มต้นโดยอัตโนมัติ
  • ใช้นักเทียบท่าเขียนและจัดเตรียม a docker-compose.ymlให้กับนักพัฒนาของคุณ
    ไฟล์นักเทียบท่าเขียนช่วยให้คุณระบุตัวเลือกทั้งหมดที่ควรใช้เมื่อเริ่มต้นคอนเทนเนอร์ดังนั้นนักพัฒนาจึงสามารถสร้างนักเทียบท่าเพื่อเริ่มคอนเทนเนอร์ด้วยตัวเลือกทั้งหมดที่จำเป็นต้องตั้งค่า

2
ฉันต้องการเปลี่ยน / etc / hosts ในอิมเมจนักเทียบท่า
Prakash

1
@PrakashSingh ฉันเห็นด้วย แต่ดูเหมือนจะไม่ง่ายเลย
VonC

1
@PrakashSingh คุณสามารถเปิดอินสแตนซ์ bash บนเครื่องผ่านทางdocket exec -it <container name> /bin/bashจากนั้นอัปเดตโฮสต์คอนเทนเนอร์ของนักเทียบท่าภายใต้ / ect / host ด้วยโปรแกรมแก้ไขบรรทัดคำสั่งที่คุณต้องการ (vim, emacs, nano, echo '' >> />)
NateAGeek

@PrakashSingh ใช่เราทำได้ (ฟังดูคุ้น ๆ ... ) แต่ดูเหมือนการแฮ็กสำหรับ Docker เมื่อเราเปลี่ยนรายการโฮสต์โดยการสร้างอิมเมจไม่ใช่การเรียกใช้คอนเทนเนอร์ การออกแบบเครือข่าย Docker ขับเคลื่อนด้วยแอปพลิเคชัน (จาก docker.com) เนื่องจากรายการโฮสต์เป็นส่วนหนึ่งของเครือข่ายนักเทียบท่าเราจึงควรกำหนดเมื่อเรียกใช้คอนเทนเนอร์จากอิมเมจ หากคุณต้องการเพิ่มรายการโฮสต์จริงๆคุณไม่ต้องเพิ่มโดยการสร้างอิมเมจทุกครั้งคุณต้องเพิ่มลงในอิมเมจพื้นฐานเพียงครั้งเดียว นั่นคือแนวทางปฏิบัติที่ดีที่สุด
Light.G

2
ในการแก้ปัญหาด้วยการติดตั้งแบบโยก / เงาในระหว่างการสร้างนักเทียบท่า --add-host: cran.rstudio.com: <IPaddress> ได้แก้ไขปัญหาให้ฉัน
bvanlew

25

คุณไม่สามารถแก้ไขไฟล์โฮสต์ในอิมเมจโดยใช้echoในRUNขั้นตอนเนื่องจาก Docker daemon จะรักษาไฟล์ (/ etc / hosts) และเนื้อหา (รายการโฮสต์) เมื่อคุณเริ่มต้นคอนเทนเนอร์จากอิมเมจ

อย่างไรก็ตามสามารถใช้สิ่งต่อไปนี้เพื่อให้ได้สิ่งเดียวกัน:

ENTRYPOINT ["/bin/sh", "-c" , "echo 192.168.254.10   database-server >> /etc/hosts && echo 192.168.239.62   redis-ms-server >> /etc/hosts && exec java -jar ./botblocker.jar " ]

สิ่งสำคัญที่ต้องสังเกตคือการใช้execคำสั่งตามเอกสารนักเทียบท่าแนะนำ การใช้execจะทำให้คำสั่ง java เป็น PID 1 สำหรับคอนเทนเนอร์ การขัดจังหวะของ Docker จะตอบสนองต่อสิ่งนั้นเท่านั้น

ดูhttps://docs.docker.com/engine/reference/builder/#entrypoint


ไท! นี่เป็นทางออกที่ยอดเยี่ยม
xero

1
ในกรณีที่คุณกำลังมองหาโซลูชัน kubenetes คุณสามารถใช้ hostAliases kubernetes.io/docs/concepts/services-networking/…เช่นเดียวกับนักเทียบท่าเขียน extra_hosts
Shubham Singh

อย่างแม่นยำยิ่งขึ้นENTRYPOINTไม่ใช่คำแนะนำสำหรับรูปภาพ จะทำเครื่องหมายเฉพาะจุดเข้าเมื่อเราเรียกใช้คอนเทนเนอร์จากอิมเมจนี้ซึ่งหมายความว่ารายการโฮสต์จะมีอยู่หลังจากที่คอนเทนเนอร์ทำงานแล้วเท่านั้น ฉันไม่คิดว่าข้อกำหนดเป็นสิ่งสำคัญ ต้องมีคนเข้าใจผิดแน่ ๆ
Light.G

17

ฉันคิดว่านักเทียบท่าเพิ่งเพิ่ม--add-hostแฟล็กให้กับนักเทียบท่าซึ่งยอดเยี่ยมมาก

[แก้ไข] ดังนั้นคุณลักษณะนี้จึงได้รับการอัปเดตเมื่อวันที่17.04.0-ce

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้docker buildกับไฟล์--add-hostธงกรุณาเยี่ยมชม: https://docs.docker.com/edge/engine/reference/commandline/build/


1
--add-hostคุณลักษณะที่มีอยู่ในหาง 12 CentOS
chutz

1
ฉันต้องการเน้นย้ำว่า "โฮสต์ที่เพิ่มด้วยแฟ
สีดาโจว

10

เนื่องจากสิ่งนี้ยังคงเป็นคำตอบแรกใน Google ฉันจะช่วยแก้ปัญหาที่เป็นไปได้

คำสั่งที่นำมาจากที่นี่ใช้งานได้ดีสำหรับฉัน (Docker 1.13.1, Ubuntu 16.04):

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"

ไม่เกี่ยวข้อง แต่ยังคงมีคุณค่า ขอบคุณ.
Light.G

4

หากสิ่งนี้มีประโยชน์สำหรับทุกคนHOSTALIASESตัวแปร env ใช้ได้กับฉัน:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases

3
คุณไม่สับสนนักเทียบท่ากับ kubernetes เหรอ? ฉันไม่เห็นตัวแปร HOSTALIASES ในเอกสารนักเทียบท่า
Adrien Lemaire

4

คุณสามารถทำได้โดยใช้คำสั่งต่อไปนี้ในขณะที่เรียกใช้นักเทียบท่า

docker run [OPTIONS] --add-host example.com:127.0.0.1 <your-image-name>:<your tag>

ที่นี่ฉันกำลังแมปexample.comกับ localhost 127.0.0.1และใช้งานได้


3

ฉันใช้ AWS Elasticbeanstalk + Docker + Supervisord

คำตอบที่รวดเร็ว

เพียงเพิ่มรหัสในDockerfile.

CMD echo 123.123.123.123 this_is_my.host >> /etc/hosts; supervisord -n;

1

คำตอบที่สมบูรณ์

  1. เตรียมhostsไฟล์ของคุณเองที่คุณต้องการเพิ่มลงใน Docker container
1.2.3.4 abc.tv
5.6.7.8 domain.xyz
1.3.5.7 odd.org
2.4.6.8 even.net
  1. คัดลอกhostsไฟล์ของคุณลงในคอนเทนเนอร์โดยเพิ่มบรรทัดต่อไปนี้ในไฟล์Dockerfile
COPY hosts /etc/hosts_extra
  1. หากคุณรู้วิธีใช้ENTRYPOINTหรือCMDหรือCRONงานให้รวมบรรทัดคำสั่งต่อไปนี้ไว้ในนั้นหรืออย่างน้อยก็เรียกใช้สิ่งนี้ภายในคอนเทนเนอร์ที่กำลังทำงานอยู่:
cat /etc/hosts_extra >> etc/hosts;
  1. คุณไม่สามารถเพิ่มสิ่งต่อไปนี้ได้Dockerfileเนื่องจากการแก้ไขจะสูญหาย:
RUN cat /etc/hosts_extra >> etc/hosts;

0

คุณสามารถใช้--add-hostระหว่างการรันนักเทียบท่า

สำหรับกรณีของคุณใช้: docker run --add-host mynginx: 192.168.33.11 [image_name]: [tag]

การดำเนินการนี้จะอัปเดต/ etc / hosts ของคุณ

คุณสามารถตรวจสอบได้โดยใช้คำสั่งต่อไปนี้:

  • นักเทียบท่า exec -it [container_id] sh

หากshไม่ได้ผลสำหรับคุณคุณสามารถลองbashหรือ/ bin / shหรือ/ bin / bash

  • ซีดี ฯลฯ
  • โฮสต์แมว

-1
Tis is me Dockefile
FROM XXXXX
ENV DNS_1="10.0.0.1 TEST1.COM"
ENV DNS_1="10.0.0.1 TEST2.COM" 
CMD ["bash","change_hosts.sh"]`

#cat change_hosts.sh
su - root -c "env | grep DNS | akw -F "=" '{print $2}' >> /etc/hosts"
  • ข้อมูล
  • ผู้ใช้ต้อง su

-2

สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉันโดยการติดตั้งไฟล์ระหว่างการทำงานของนักเทียบท่าแทนการสร้างนักเทียบท่า

docker service create --name <name>  --mount type=bind,source=/etc/hosts,dst=/etc/hosts   <image>

การเพิ่มไฟล์โดยใช้โวลุ่มสร้างความซับซ้อนเพิ่มเติมและทุกโฮสต์จะต้องมีไฟล์
Shubham Singh

-11

เพียงคำตอบสั้น ๆ ในการเรียกใช้คอนเทนเนอร์ของคุณโดยใช้:

docker exec -it <container name> /bin/bash

เมื่อเปิดภาชนะแล้ว:

cd ..

แล้ว

`cd etc`

แล้วคุณก็ทำได้

cat hosts

หรือ:

apt-get update
apt-get vim

หรือตัวแก้ไขใด ๆ ที่คุณชอบและเปิดเป็นกลุ่มที่นี่คุณสามารถแก้ไขบอกว่า ip เริ่มต้นของคุณเป็น 0.0.0.0

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