2015-05-17 21 views
5

Ho le seguenti righe in un Dockerfile in cui voglio impostare un valore in un file di configurazione su un valore predefinito prima dell'avvio dell'applicazione alla fine e fornire facoltativamente l'impostazione utilizzando l'opzione -e quando si avvia il contenitore.Passaggio da contenitore a file

io sto cercando di fare questo usando Docker ENV commando

ENV CONFIG_VALUE default_value 
RUN sed -i 's/CONFIG_VALUE/'"$CONFIG_VALUE"'/g' CONFIG_FILE 
CMD command_to_start_app 

ho la config_value stringa in modo esplicito nel file CONFIG_FILE e il valore predefinito dalla Dockerfile viene correttamente sostituito. Tuttavia, quando eseguo il contenitore con l'aggiunta di -e CONFIG_VALUE=100, la sostituzione non viene eseguita, viene mantenuto il valore predefinito impostato nel Dockerfile.

Quando faccio

docker exec -i -t container_name bash 

e echo $CONFIG_VALUE all'interno del contenitore della variabile di ambiente contiene il valore desiderato 100.

+0

Grazie, per incidenza il tuo esempio mi ha aiutato a "scappare" la variabile di ambiente per sed correttamente (escludendo la parte con ""). – sebkraemer

risposta

5

che non dovrebbe essere possibile in un Dockerfile: tali istruzioni sono statici, per rendere un'immagine.

Se sono necessarie istruzioni di runtime all'avvio di un contenitore, è necessario codificarle in uno script richiamato dalla direttiva CMD.
In altre parole, lo sed si svolgerà in uno script chiamato da CMD. Quando si esegue lo docker run, tale script avrebbe accesso alla variabile di ambiente impostata appena prima di detta docker run.

7

Le istruzioni nel file Docker vengono valutate line-by-line quando si esegue docker build e non vengono rivalutate in fase di esecuzione.

È comunque possibile farlo utilizzando uno script di un punto di accesso, che verrà valutato in fase di esecuzione dopo che sono state impostate le variabili di ambiente.

Ad esempio, è possibile definire le seguenti entrypoint.sh script:

#!/bin/bash 

sed -i 's/CONFIG_VALUE/'"$CONFIG_VALUE"'/g' CONFIG_FILE 
exec "[email protected]" 

Il exec "[email protected]" eseguirà qualsiasi CMD o comando che viene impostato.

aggiungerlo alla Dockerfile es:

COPY entrypoint.sh/
RUN chmod +x /entrypoint.sh 
ENTRYPOINT ["/entrypoint.sh"] 

Si noti che se si dispone di un entrypoint esistente, è necessario fonderlo con questo - si può avere un solo entrypoint.

Ora si dovrebbe trovare cioè che la variabile d'ambiente è rispettato:

docker run -e CONFIG_VALUE=100 container_name cat CONFIG_FILE 

dovrebbe funzionare come previsto.