Dockerfile HOSTNAME Anleitung für docker build wie docker run-h
Ich bin versucht, den Hostnamen innerhalb eines docker-container, die während dem bauen, da bestimmte software installiert verwenden Sie die entdeckt zufällig generierte hostname und dauerhaft zu Backen, dass der hostname in der Konfiguration.
Während es möglich ist, zum festlegen des Hostnamens beim ausführen interaktiv über ausführen -h, die gleiche Funktionalität ist nicht verfügbar build über das Dockerfile.
Der einzige Weg, dies zu umgehen ist die Verwendung von LD_PRELOAD hacks, so dass ich den Hostnamen auf "localhost". Die LD_PRELOAD-hacks haben unerwünschte Nebeneffekte, die ich habe Probleme bei der Arbeit um. Die software zu installieren, funktioniert ohne Problem, wenn Sie mit "docker run-it-h localhost ".
strace berichtet, dass der installer einen Aufruf von uname ermitteln den Hostnamen.
uname({sys="Linux", node="12b0c7c7eacb", ...}) = 0
Weiß jemand, wie es möglich sein könnte, um diese Einschränkung zu umgehen?
Update 1
Dies ist nicht ein Duplikat der Frage Wie behandeln bestimmte Hostnamen wie-h-option im Dockerfile wie die reden, speziell über "/etc/hosts" Probleme, die sich aus dieser Datei wird dynamisch generiert. Dies wird einfach umgangen, da es eine beschreibbare Datei.
Dies ist über die software installiert, die den Versuch zum auflösen der Hostnamen über system calls wie z.B. uname-und gethostname. Was ich sagen kann, dies kann nicht umgangen werden, da der hostname nicht geändert werden, in einen Laufenden docker-container. Die uname-system rufen Sie wahrscheinlich Referenzen /proc/sys/kernel/hostname, dieser ist schreibgeschützt und kann nicht geändert werden. Normalerweise wird der Befehl hostname ausgeführt werden könnte, aber dieser Befehl erzeugt einen Fehler, Sie müssen root sein, auch wenn Sie root sind. Die Lösung HIERFÜR ist die Verwendung des -h-flag, das ist nicht verfügbar in baut.
Update 2
Für alle, die sich für einen workaround hier ist es, das muss nur verwendet werden, während die docker erstellen, verwenden Sie die h-Kennzeichen, wenn Sie müssen passen Sie den Hostnamen mit docker run. Grundlage dafür ist jemand anderes die Arbeit.
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 als pro into_the_void, da es keine Lösung für dieses problem.
- Sieht meine Antwort hier helfen? stackoverflow.com/a/28922278/1220269
- Vielen Dank für Ihre Antwort Nathaniel; ich glaube, Ihre Antwort war das einzige, was ich finden konnte im internet über dieses Thema. Die software, die ich installiere, sieht das in /etc/hosts, sondern nutzt die uname-system-Aufruf zur Ableitung der hostname. Ich halte Ihre Lösung im Auge in die Zukunft.
- möglich, Duplikat der Wie behandeln bestimmte Hostnamen wie-h-option im Dockerfile
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie mich sehen, ob ich Ihre Frage verstehe, Sie möchten bauen, ein Bild, das bei der Ausführung als container ist die Laufzeitumgebung Hostnamen, auch wenn der hostname für den Bau verwendet, ist nicht das gleiche. Richtig? Wenn dem so ist, meine Frage an Euch ist folgende, sind Sie in der Lage, die software neu konfigurieren, um einen neuen Hostnamen, nachdem es installiert ist?
Wenn das möglich ist, würde ich empfehlen, ein Skript zu schreiben, dass ist in der Lage, ändern Sie den Hostnamen und verwenden Sie dieses Skript als eine
ENTRYPOINT
. Auf diese Weise können Sie garantieren, dass Sie behoben haben, der hostname jederzeit Ihren container ausgeführt wird (mit irgendeinem Befehl) und Sie verbringen Ihre Zeit nicht versucht zu zwingen, die Unterstützung für einen bestimmten Hostnamen durch zur build-Zeit, die, von Ihrem eigenen Eintritt, ist schwierig zu tun.Können Sie
Andockfenster-verfassen
bauen Sie Ihr Bild an und ordnen Sie den Hostnamen, z.B.Ausführende:
docker-compose --build up
.Ich hatte vor kurzem ein ähnliches Problem.
Die Lösung, die für mich gearbeitet wurde, um den Hostnamen in den container namespace.
Zu machen das automatisch, ich habe zusammen die folgenden docker build-Skript:
Rechts am Ende
new-hostname
ersetzt werden kann, mit den gewünschten Hostnamen.Meine Dockerfile sieht wie folgt aus:
Die erste Zeile druckt
change-hostname $(hostname)
(wobei hostname sollte drucken Sie die aktuellen container-id) signalisiert die buildscripts ändern Sie den hostname für diesen container. Das build-Skript dann Abfragen der pid für den container und führthostname 'new-hostname'
in seiner uts-Namensraum. Diesleep 1
gibt nur das build-Skript einige Zeit zur Anpassung der hostname richtig. Dann habe ich ändern/etc/hostname
und/etc/hosts
gehören der neu gesetzte hostname.Diese auch Veränderungen der Ausgabe von
uname -n
also ich bin mir ziemlich sicher, dass es funktionieren würde, wie eine Lösung für die ursprüngliche Frage.