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.

InformationsquelleAutor Trevor Fuson | 2015-03-19
Schreibe einen Kommentar