"डॉक बिल्ड" के दौरान डॉक की छवि में फ़ाइल को कैसे अपडेट / होस्ट / होस्ट किया जाए?


106

मैं /etc/hosts"docker build" के दौरान अपनी फाइल अपडेट करना चाहता हूं ।

मैंने Dockerfile में लाइन के नीचे जोड़ा लेकिन यह न तो /etc/hostsफ़ाइल को अपडेट कर रहा है और न ही कोई त्रुटि दे रहा है।

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

मुझे अपडेट करने की जरूरत है /etc/hosts। क्या कोई इस पर सुझाव दे सकता है?


क्या आप अपने docker बिल्ड को निष्पादित करने के लिए boot2docker का उपयोग कर रहे हैं?
VonC

नहीं, मैं डॉक १.। के लिनक्स संस्करण का उपयोग कर रहा हूं।
प्रकाश

1
और जब आप अपनी छवि एक कंटेनर के रूप में चला रहे हैं, तो उसके / etc / मेजबान अपरिवर्तित हैं? या आप अपने लिनक्स होस्ट / आदि / मेजबानों का जिक्र कर रहे थे?
VonC

4
Docker बिल्ड छवि के दौरान सफलतापूर्वक बनाया गया है। लेकिन जब मैं एक ही छवि का उपयोग करके कंटेनर चलाता हूं और मैंने / etc / होस्ट फ़ाइल की जाँच की, तो परिवर्तन नहीं हुआ।
प्रकाश

जवाबों:


141

कर्ता के अधिक हाल के संस्करण के साथ, यह कर्ता-रचना और इसके निर्देश के साथ किया जा सकता हैextra_hosts

होस्टनाम मैपिंग जोड़ें। क्लाइंट पैरामीटर के
रूप में समान मानों का उपयोग करें (जो पहले से ही docker 1.8 के लिए उपलब्ध होना चाहिए)।docker run--add-host

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

संक्षेप में: /etc/hostsइसे चलाते समय अपने कंटेनर को संशोधित करें, इसका निर्माण न करें।


डॉकर 17.x + के साथ, आपने नीचेdocker build --add-host उल्लेख किया है , लेकिन, जैसा कि अंक 34078 और इस उत्तर में टिप्पणी की गई है :

--add-hostबिल्ड के दौरान की सुविधा बिल्ड के दौरान होस्ट को ओवरराइड करने की अनुमति देने के लिए डिज़ाइन की गई है, लेकिन छवि में उस कॉन्फ़िगरेशन को जारी रखने के लिए नहीं।

उल्लिखित समाधान docker- रचना का उल्लेख करते हैं जो मैं ऊपर सुझाव दे रहा था:

  • एक आंतरिक डीएनएस चलाएं; आप डिफ़ॉल्ट डीएनएस सर्वर को डेमॉन में उपयोग करने के लिए सेट कर सकते हैं; इस तरह से शुरू किया गया हर कंटेनर डिफ़ॉल्ट रूप से कॉन्फ़िगर किए गए DNS का उपयोग करेगा
  • डॉकटर रचना का उपयोग करें और docker-compose.ymlअपने डेवलपर्स को प्रदान करें।
    डॉकटर कम्पोज़ फ़ाइल आपको उन सभी विकल्पों को निर्दिष्ट करने की अनुमति देती है, जिनका उपयोग कंटेनर को शुरू करते समय किया जाना चाहिए, इसलिए डेवलपर्स कंटेनर को केवल उन सभी विकल्पों के साथ शुरू करने के लिए तैयार कर सकते हैं, जिन्हें उन्हें सेट करने की आवश्यकता है।

2
मैं docker की छवि में / etc / host को बदलना चाहता हूँ।
प्रकाश

1
@PrakashSingh मैं सहमत हूं, लेकिन ऐसा करना आसान नहीं लगता।
वॉनसी

1
@PrakashSingh आप इसके माध्यम से मशीन पर एक बाश उदाहरण खोल सकते हैं docket exec -it <container name> /bin/bash, फिर अपने पसंदीदा कमांड लाइन संपादक (vim, emacs, nano, echo ''। >> />) के साथ docker के कंटेनर होस्ट को / ect / host में अपडेट करें।
नैटकेक

@PrakashSingh हाँ हम कर सकते हैं (परिचित लगता है ...)। लेकिन यह सिर्फ डॉकर के लिए हैक की तरह दिखता है जब हम एक कंटेनर का संचालन करके, एक छवि का निर्माण करके मेजबान प्रविष्टि को बदलते हैं। डॉकर नेटवर्क डिजाइन अनुप्रयोग संचालित है (docker.com से)। चूंकि मेजबान प्रविष्टि docker नेटवर्क का हिस्सा है, हम छवि से कंटेनर चलाते समय इसे बेहतर तरीके से परिभाषित करेंगे। यदि आपको वास्तव में कुछ मेजबान प्रविष्टि को जोड़ने की आवश्यकता है, तो आप उन्हें हर बार छवि बनाने से नहीं जोड़ते हैं, आप उन्हें एक बार आधार छवि में जोड़ते हैं। यही सबसे अच्छा अभ्यास है।
लाइट.जी।

2
Docker build --add-host: cran.rstudio.com: <IPaddress> के दौरान रॉकर / चमकदार install.packages के साथ एक समस्या को हल करने के लिए मेरे लिए इस मुद्दे को हल किया।
bvanlew

25

आप का उपयोग कर छवि में मेजबान फ़ाइल को संशोधित नहीं कर सकते echoमें RUNहै जब आप छवि से एक कंटेनर शुरू कदम क्योंकि डोकर डेमॉन फ़ाइल बनाए रखेंगे (/ 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कमांड का उपयोग डॉक्यूमेंट के सुझाव के अनुसार होता है। निष्पादन का उपयोग कंटेनर के लिए पीआईडी ​​1 के रूप में जावा कमांड बनाएगा। डॉकर इंटरप्ट केवल उस पर प्रतिक्रिया देगा।

Https://docs.docker.com/engine/reference/builder/#entrypoint देखें


Ty! यह एक महान उपाय है
xero

1
मामले में आप kubenetes समाधान के लिए देख रहे हैं आप hostAliases का उपयोग कर सकते हैं। kubernetes.io/docs/concepts/services-networking/… ठीक वैसे ही जैसे docker extra_hosts की रचना करता है।
शुभम सिंह

अधिक सटीक रूप से, ENTRYPOINTछवि के लिए एक निर्देश नहीं है। यह केवल एक प्रविष्टि बिंदु को चिह्नित करता है जब हम इस छवि से एक कंटेनर चलाते हैं, जिसका अर्थ है कि कंटेनर के चलने के बाद ही मेजबान प्रविष्टि मौजूद है। मुझे नहीं लगता कि आवश्यकता जरूरी है। कुछ गलतफहमी तो होनी ही चाहिए।
लाइट.जी।

17

मुझे लगता है कि हाल ही में docker ने --add-hostझंडा बनाया है जो वास्तव में बहुत अच्छा है।

[संपादित करें] इसलिए यह सुविधा १.0.०४.०-सी ई पर अपडेट की गई थी

झंडे के docker buildसाथ उपयोग करने के बारे में अधिक जानकारी के लिए --add-hostकृपया देखें: https://docs.docker.com/edge/engine/reference/commandline.build/


1
यह --add-hostसुविधा डॉकटर 12 पर CentOS पर उपलब्ध है।
चुतज

1
मैं इस बात पर जोर देना चाहता हूं कि "इस ध्वज के साथ जोड़ा गया होस्ट केवल निर्माण के दौरान उपयोग किया जाता है; यह जानबूझकर छवि में नहीं रहना चाहिए" github.com/moby/moby/issues/34078
Sida

10

चूंकि यह अभी भी Google में पहले उत्तर के रूप में आता है इसलिए मैं संभावित समाधान में योगदान दूंगा।

से कमान ली यहाँ ने मेरे लिए काम किया (डॉकटर १.१३.१, उबंटू १६.०४):

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

प्रासंगिक नहीं है लेकिन फिर भी मूल्यवान है। धन्यवाद।
लाइट.जी।

4

यदि यह किसी के लिए उपयोगी है, तो HOSTALIASESenv चर ने मेरे लिए काम किया:

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

3
क्या आप कुबेरनेट्स के साथ भ्रमित नहीं कर रहे हैं? मुझे डॉक्यूमेंट डॉक्यूमेंटेशन में कोई HOSTALIASES वैरिएबल नहीं दिख रहा है
Adrien Lemaire

4

डॉकिंग रनिंग के समय आप निम्न कमांड के साथ कर सकते हैं

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

यहां मैं example.comलोकलहोस्ट 127.0.0.1और इसके काम करने के लिए मैप कर रहा हूं ।


3

मैं AWS इलास्टिकबेस्टल + डोकर + सुपरवाइजर का उपयोग कर रहा हूं।

शीघ्र जवाब

बस कुछ कोड जोड़ें Dockerfile

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

1

पूरा जवाब

  1. अपनी खुद की hostsफ़ाइल तैयार करें जिसे आप डॉकटर कंटेनर में जोड़ना चाहते हैं;
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- होस्ट का उपयोग कर सकते हैं रन के दौरान विकल्प का ।

आपके केस के उपयोग के लिए: docker run --add-host mynginx: 192.168.33.11 [image_name]: [टैग]

यह आपके / etc / मेजबानों को अपडेट करेगा

आप निम्न आदेशों का उपयोग करके इसकी जांच कर सकते हैं:

  • docker exec -it [कंटेन_id] श

यदि नॉट आपके लिए काम करता है, तो आप बैश या / बिन / श या / बिन / बैश की कोशिश कर सकते हैं

  • सीडी आदि
  • बिल्ली मेजबान

-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"
  • जानकारी
  • उपयोगकर्ता को चाहिए

-2

निम्नलिखित के लिए docker चलाने के बजाय docker चलाने के दौरान फ़ाइल को माउंट करके मेरे लिए काम किया

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

वॉल्यूम का उपयोग करके एक फ़ाइल जोड़ने से अतिरिक्त जटिलता पैदा होती है और प्रत्येक होस्ट के पास फ़ाइल होती है।
शुभम सिंह

-11

अपने कंटेनर का उपयोग करने के लिए बस एक त्वरित उत्तर:

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

एक बार कंटेनर खुला है:

cd ..

फिर

`cd etc`

और फिर आप कर सकते हैं

cat hosts

या:

apt-get update
apt-get vim

या कोई भी संपादक जिसे आप पसंद करते हैं और उसे खोलते हैं, यहाँ आप अपने स्टार्टअप आईपी को 0.0.0.0 में संशोधित कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.