2015-03-19 22 views
5

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.

+0

La mia risposta qui ti può aiutare? http://stackoverflow.com/a/28922278/1220269 –

+0

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

+0

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) –

risposta

1

Vediamo se ho capito la tua domanda, si vorrebbe costruire un'immagine che quando viene eseguito come un contenitore ha il nome dell'host runtime, anche se il nome host utilizzato per la costruzione non è la stessa. Corretta? Se è così, la mia domanda è la seguente, sei in grado di riconfigurare il software per avere un nuovo nome host dopo l'installazione?

Se ciò è possibile, è consigliabile scrivere uno script in grado di modificare il nome host e utilizzare questo script come ENTRYPOINT. In questo modo puoi garantire di aver corretto il nome host ogni volta che il tuo contenitore viene eseguito (con qualsiasi comando) e non passi il tempo a forzare il supporto per un particolare nome host fino al momento della compilazione, che, per tua stessa ammissione, è difficile fare.

+0

Questo è un ottimo suggerimento, gli script per punti di accesso sono ciò che facciamo per tutte le nostre immagini di finestra mobile. Sfortunatamente questo software configura il nome host in circa 60 posizioni, da file di testo, file xml e file binari interni. Il metodo consigliato di modifica del nome host indica una reinstallazione del software più alcuni passaggi aggiuntivi. Ciò significa che il tempo di avvio del punto di accesso dovrebbe aumentare da 2 minuti a circa 40 minuti, il che non è fattibile. –

+1

Bene, potrebbe essere il momento di provare il tracker dei problemi (http://github.com/docker/docker/issues) perché non credo che questa funzionalità esista o almeno non l'abbia mai trovata. - into_the_void 55 minuti fa – jakirkham

+0

Grazie per queste informazioni, penso che questa sia la risposta corretta. –

Problemi correlati