2015-03-19 20 views
5

Ich versuche den Hostnamen während des Builds in einem Andockcontainer zu setzen, da bestimmte Softwareinstallationen den ermittelten zufällig generierten Hostnamen verwenden und diesen Hostnamen permanent in die Konfiguration einbinden.Dockerfile HOSTNAME Anweisung für docker build wie docker run -h

Es ist zwar möglich, den Hostnamen bei der Ausführung interaktiv über run -h festzulegen, die gleiche Funktionalität ist jedoch nicht verfügbar, wenn Sie über die Dockerdatei erstellen.

Die einzige Möglichkeit, dies zu umgehen, ist die Verwendung von LD_PRELOAD-Hacks, so dass ich den Hostnamen auf localhost setzen kann. Die LD_PRELOAD-Hacks haben unerwünschte Nebeneffekte, mit denen ich nicht umgehen kann. Die Softwareinstallation funktioniert ohne Probleme, wenn "docker run -it -h localhost" verwendet wird.

strace meldet, dass das Installationsprogramm einen Aufruf zum Aufheben der Ermittlung des Hostnamens aufruft.

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

Weiß jemand wie es möglich ist, diese Einschränkung zu umgehen?

Update 1

Dies ist kein Duplikat der Frage How to handle specific hostname like -h option in Dockerfile wie speziell über „/ etc/hosts“ Probleme aus dieser Datei dynamisch erzeugt wird entstehen, zu sprechen. Dies ist leicht zu umgehen, da es sich um eine beschreibbare Datei handelt.

Es handelt sich um Softwareinstallationen, die versuchen, den Hostnamen von Systemaufrufen wie uname und gethostname aufzulösen. Von dem, was ich sagen kann, kann dies nicht umgehen, da der Hostname nicht in einem laufenden Docker-Container geändert werden kann. Der uname Systemaufruf referenziert wahrscheinlich/proc/sys/kernel/hostname, dies ist schreibgeschützt und kann nicht geändert werden. Normalerweise könnte der Befehl hostname ausgeführt werden, aber dieser Befehl erzeugt einen Fehler, der Sie root sein müssen, selbst wenn Sie root sind. Um dies zu umgehen, verwenden Sie das Flag -h, das in Builds nicht verfügbar ist.

Update 2

Für alle, die dieses Problem zu umgehen suchen hier ist es, dies braucht nur während der Docker bauen, verwenden Sie das Flag -h verwendet werden, wenn Sie den Hostnamen mit Docker Lauf anpassen müssen. Dies basiert auf der Arbeit einer anderen Person.

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 
    .. 

C Quelle:

#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 gemäß into_the_void, da es keine Lösung für dieses Problem ist.

+0

Hilft Ihnen meine Antwort hier? http://stackoverflow.com/a/28922278/1220269 –

+0

Danke für Ihre Antwort Nathaniel; Ich denke, dass Ihre Antwort das einzige war, was ich im Internet über dieses Thema finden konnte. Die Software, die ich installiere, betrachtet/etc/hosts, benutzt aber den uname-Systemaufruf, um den Hostnamen abzuleiten. Ich werde Ihre Lösung in Zukunft berücksichtigen. –

+0

mögliche Duplikate von [So behandeln Sie spezifische Hostnamen wie -h in Dockerfile] (http://stackoverflow.com/questions/28898787/how-to-handle-specific-hostname-like-h-option-in-dockerfile) –

Antwort

1

Lassen Sie mich sehen, wenn ich Ihre Frage verstehe, möchten Sie ein Bild erstellen, dass, wenn als Container ausgeführt hat die Laufzeit Hostname, auch wenn der Hostname für das Erstellen nicht identisch ist. Richtig? Wenn ja, meine Frage an Sie ist, können Sie die Software neu konfigurieren, um einen neuen Hostnamen nach der Installation zu haben?

Wenn das möglich ist, würde ich empfehlen, ein Skript zu schreiben, das in der Lage ist, den Hostnamen zu ändern und dieses Skript als ENTRYPOINT zu verwenden. Auf diese Weise können Sie garantieren, dass Sie den Hostnamen bei jeder Ausführung des Containers (mit einem beliebigen Befehl) korrigiert haben und keine Zeit damit verschwenden, die Unterstützung für einen bestimmten Hostnamen bis zur Build-Zeit zu erzwingen, was nach Ihrer eigenen Einschätzung schwierig ist machen.

+0

Das ist ein großartiger Vorschlag, Einstiegspunkt-Skripte sind das, was wir für all unsere Docker-Bilder machen. Leider konfiguriert diese Software den Hostnamen an ungefähr 60 Stellen, von Textdateien, XML-Dateien und internen Binärdateien. Die empfohlene Methode für eine Änderung des Hostnamens bedeutet eine Neuinstallation der Software und einige zusätzliche Schritte. Dies bedeutet, dass die Startzeit des Eintrittspunkts von 2 Minuten auf etwa 40 Minuten steigen würde, was nicht durchführbar ist. –

+1

Nun, es könnte Zeit sein, den Issue Tracker (http://github.com/docker/docker/issues) auszuprobieren, da ich nicht glaube, dass diese Funktionalität existiert oder zumindest nicht darauf gestoßen ist. - into_the_void Vor 55 Minuten – jakirkham

+0

Vielen Dank für diese Information, ich denke, dass dies die richtige Antwort ist. –

Verwandte Themen