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.
Hilft Ihnen meine Antwort hier? http://stackoverflow.com/a/28922278/1220269 –
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. –
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) –