Sto tentando di impostare il nome host all'interno di un contenitore finestra mobile durante la generazione poiché alcune installazioni software utilizzano il nome host generato in modo casuale e definiscono definitivamente il nome host nella configurazione.Dockerfile HOSTNAME Istruzione per docker build come finestra mobile run -h
Mentre è possibile impostare il nome host quando si esegue in modo interattivo tramite run -h, la stessa funzionalità non è disponibile utilizzando la build tramite il Dockerfile.
L'unico modo per aggirare questo problema è utilizzare gli hack LD_PRELOAD in modo che sia possibile impostare il nome host su localhost. Gli hack LD_PRELOAD hanno effetti collaterali indesiderati che ho problemi a lavorare in giro. L'installazione del software funziona senza problemi quando si utilizza "docker run -it -h localhost".
strace segnala che l'installatore effettua una chiamata a uname determina il nome host.
uname({sys="Linux", node="12b0c7c7eacb", ...}) = 0
Qualcuno sa come potrebbe essere possibile aggirare questa limitazione?
Update 1
Questo non è un duplicato della domanda How to handle specific hostname like -h option in Dockerfile come quello sta parlando specificamente di "/ hosts/etc" problemi derivanti da tale file viene generato in modo dinamico. Questo è facilmente risolto poiché è un file scrivibile.
Si tratta di installazioni di software che tentano di risolvere il nome host da chiamate di sistema come uname e gethostname. Da quello che posso dire, questo non può essere risolto poiché il nome host non può essere modificato all'interno di un contenitore mobile. La chiamata di sistema uname probabilmente fa riferimento a/proc/sys/kernel/hostname, questa è di sola lettura e non può essere modificata. Normalmente il comando hostname può essere eseguito, ma questo comando genera un errore che devi essere root anche se sei root. La soluzione per questo è usare il flag -h, questo non è disponibile nelle build.
Update 2
Per chi cerca una soluzione qui è, questo ha solo bisogno di essere usato durante la costruzione finestra mobile, utilizzare il flag -h se è necessario personalizzare il nome host con corsa finestra mobile. Questo è basato sul lavoro di qualcun altro.
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 Fonte:
#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 secondo into_the_void in quanto non v'è alcuna soluzione a questo problema.
La mia risposta qui ti può aiutare? http://stackoverflow.com/a/28922278/1220269 –
Grazie per la risposta Nathaniel; Penso che la tua risposta sia stata l'unica cosa che ho trovato su internet su questo argomento. Il software che sto installando guarda/etc/hosts ma usa la chiamata di sistema uname per derivare il nome host. Terrò a mente la tua soluzione in futuro. –
possibile duplicato di [Come gestire l'hostname specifico come opzione -h in Dockerfile] (http://stackoverflow.com/questions/28898787/how-to-handle-specific-hostname-like-h-option-in-dockerfile) –