2015-03-19 9 views
5

मैं मेजबाननाम को बिल्ड के दौरान एक डॉकर कंटेनर के अंदर सेट करने का प्रयास कर रहा हूं क्योंकि कुछ सॉफ़्टवेयर इंस्टॉल खोजे गए यादृच्छिक रूप से जेनरेट किए गए होस्टनाम का उपयोग करते हैं और उस मेजबाननाम को कॉन्फ़िगरेशन में स्थायी रूप से सेंकते हैं।डॉकरफ़ाइल HOSTNAME डॉकर बिल्ड के लिए निर्देश डॉकर रन -h

जब आप run -h के माध्यम से इंटरैक्टिव रूप से चलाते हैं तो होस्टनाम सेट करना संभव है, वही कार्यक्षमता डॉकरफ़ाइल के माध्यम से निर्माण का उपयोग करके उपलब्ध नहीं है।

इसके आसपास काम करने का एकमात्र तरीका एलडी_PRELOAD हैक्स का उपयोग करना है ताकि मैं मेजबाननाम को लोकहोस्ट में सेट कर सकूं। LD_PRELOAD हैक्स में अवांछित दुष्प्रभाव हैं जो मुझे आसपास काम करने में परेशानी हो रही हैं। सॉफ़्टवेयर इंस्टॉल "डॉकर रन-एट-लोकहोस्ट" का उपयोग करते समय समस्या के बिना काम करता है।

स्ट्रेस रिपोर्ट्स कि इंस्टॉलर होस्टनाम निर्धारित करने के लिए एक कॉल करने के लिए कॉल करता है।

uname({sys="Linux", node="12b0c7c7eacb", ...}) = 0 

क्या किसी को पता है कि इस सीमा के आसपास काम करना संभव कैसे हो सकता है?

अद्यतन 1

इस सवाल का डुप्लिकेट How to handle specific hostname like -h option in Dockerfile कि के रूप में के बारे में "/ etc/hosts" उस फ़ाइल से उत्पन्न होने वाली गतिशील रूप से उत्पन्न की जा रही समस्याओं विशेष रूप से बात कर रही है नहीं है। यह आसानी से काम किया जाता है क्योंकि यह एक लिखने योग्य फ़ाइल है।

यह सॉफ़्टवेयर इंस्टॉल के बारे में है जो होस्ट नाम से होस्टनाम को हल करने का प्रयास करता है जैसे uname और gethostname। जो मैं कह सकता हूं उससे यह काम नहीं किया जा सकता है क्योंकि मेजबाननाम को चलने वाले डॉकर कंटेनर में बदला नहीं जा सकता है। अनमोल सिस्टम संभावित संदर्भ/proc/sys/कर्नेल/होस्टनाम कॉल करता है, यह केवल पढ़ा जाता है और बदला नहीं जा सकता है। आम तौर पर होस्टनाम कमांड चलाया जा सकता है, लेकिन यह आदेश एक त्रुटि उत्पन्न करता है जो रूट होने पर भी रूट होना चाहिए। इसके लिए कामकाज -एच ध्वज का उपयोग करना है, यह निर्माण में उपलब्ध नहीं है।

अद्यतन 2

एक समाधान यहाँ यह है की तलाश में किसी को भी लिए, यह केवल, डोकर निर्माण के दौरान प्रयोग की जाने वाली -h झंडा उपयोग करें यदि आप डोकर रन के साथ होस्ट नाम अनुकूलित करने के लिए की जरूरत की जरूरत है। यह किसी और के काम पर आधारित है।

Dockerfile:

RUN gcc -o fakehostname.o -c -fPIC -Wall fakehostname.c 
RUN gcc -o libfakehostname.so -shared -W1,export-dynamic fakehostname.o -ldl 

RUN .. 
    export LD_PRELOAD=/u01/app/oracle/libfakehostname.so;\ 
    installer section 
    .. 

सी स्रोत:

रूप
#define _GNU_SOURCE 
#include <unistd.h> 
#include <sys/syscall.h> 
#include <sys/types.h> 
#include <sys/utsname.h> 

#include <stdio.h> 
#include <string.h> 

static int (*real_gethostname)(char *name, size_t len); 

int uname(struct utsname *buf) 
{ 
int ret; 

ret = syscall(SYS_uname, buf); 

strcpy(buf->nodename, "localhost"); 

return ret; 
} 

int gethostname(char *name, size_t len) 
{ 
    const char *val; 

    /* Override hostname */ 
    val = "localhost"; 
    if (val != NULL) 
    { 
    strncpy(name, val, len); 
    return 0; 
    } 

    /* Call real gethostname() */ 
    return real_gethostname(name, len); 
} 

http://github.com/docker/docker/issues प्रति into_the_void के रूप में इस समस्या का कोई समाधान नहीं है।

+0

क्या मेरा उत्तर यहां आपकी मदद करता है? http://stackoverflow.com/a/28922278/1220269 –

+0

आपकी प्रतिक्रिया नथनील के लिए धन्यवाद; मुझे लगता है कि आपका जवाब एकमात्र चीज थी जिसे मैं इस विषय के बारे में इंटरनेट पर पा सकता था। मैं जिस सॉफ़्टवेयर को इंस्टॉल कर रहा हूं वह/etc/hosts पर दिखता है लेकिन मेजबाननाम प्राप्त करने के लिए अनमोल सिस्टम कॉल का उपयोग करता है। मैं भविष्य में आपके समाधान को ध्यान में रखूंगा। –

+0

संभावित डुप्लिकेट [डॉकरफ़ाइल में -एच विकल्प जैसे विशिष्ट होस्टनाम को कैसे प्रबंधित करें] (http://stackoverflow.com/questions/28898787/how-to-handle-specific-hostname-like-h-option-in-dockerfile) –

उत्तर

1

मुझे देखने दो कि क्या मैं आपका प्रश्न समझता हूं, आप एक ऐसी छवि बनाना चाहते हैं जो कंटेनर के रूप में चलने पर रनटाइम होस्टनाम हो, भले ही भवन के लिए उपयोग किया गया होस्टनाम समान न हो। सही बात? यदि ऐसा है, तो मेरा प्रश्न आपको निम्न है, क्या आप सॉफ़्टवेयर को पुन: कॉन्फ़िगर करने में सक्षम होने के बाद नया होस्टनाम स्थापित कर सकते हैं?

यदि यह संभव है, तो मैं एक स्क्रिप्ट लिखने की अनुशंसा करता हूं जो होस्टनाम को संशोधित करने में सक्षम है और इस स्क्रिप्ट को ENTRYPOINT के रूप में उपयोग करने में सक्षम है। इस तरह आप गारंटी दे सकते हैं कि आपने कभी भी अपना कंटेनर चलाने के लिए मेजबाननाम को सही किया है (किसी भी कमांड के साथ) और आप बिल्ड समय पर किसी विशेष होस्टनाम के लिए समर्थन को मजबूर करने का प्रयास नहीं करते हैं, जो आपके स्वयं के प्रवेश से मुश्किल है करने के लिए।

+0

यह एक अच्छा सुझाव है, एंट्रीपॉइंट स्क्रिप्ट वह है जो हम अपने सभी डॉकर छवियों के लिए करते हैं। दुर्भाग्यवश यह सॉफ़्टवेयर पाठ फ़ाइलों, xml फ़ाइलों और अंदरूनी बाइनरी फ़ाइलों से होस्ट के नाम को लगभग 60 स्थानों में कॉन्फ़िगर करता है। होस्टनाम परिवर्तन की अनुशंसित विधि का मतलब सॉफ़्टवेयर के पुन: इंस्टॉल और कुछ अतिरिक्त चरणों का है। इसका मतलब है कि एंट्रीपॉइंट स्टार्टअप समय 2 मिनट से 40 मिनट तक बढ़ जाएगा जो संभव नहीं है। –

+1

ठीक है, यह समस्या ट्रैकर (http://github.com/docker/docker/issues) को आजमाने का समय हो सकता है क्योंकि मुझे विश्वास नहीं है कि यह कार्यक्षमता मौजूद है या कम से कम इस पर नहीं आ गई है। - in_the_void 55 मिनट पहले – jakirkham

+0

इस जानकारी के लिए धन्यवाद, मुझे लगता है कि यह सही जवाब है। –

संबंधित मुद्दे