2014-06-19 12 views
9

Ho un'applicazione che utilizza una variabile di ambiente denominata REDIS_URL. Un tipico REDIS_URL sarebbe redis://172.17.0.5:6379/0. Mi piacerebbe essere in grado di popolare REDIS_URL sulla base di contenitore linking:Utilizzo di variabili di ambiente del contenitore collegato nell'ambiente dell'applicazione?

docker run --name redis -d redis 
docker run --name firehose --link redis:redis -e REDIS_URL="redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT/0" -d firehose/server 

Ma a seconda di come mi sfuggire alle variabili d'ambiente, o sono valutati nel mio guscio in fase di esecuzione e finestra mobile sono vuote (redis://:/0), o passati come stringhe letterali (redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT/0).

Come posso popolare la mia variabile di ambiente applicativa REDIS_URL in base al collegamento del conineratore?

risposta

7

Le variabili $REDIS_PORT_6379_TCP_ADDR e $REDIS_PORT_6379_TCP_PORT non sono note al momento dell'esecuzione del comando docker run, quindi non è possibile costruirlo dall'host.

Tuttavia, esiste una soluzione alternativa. Nello Dockerfile per l'immagine firehose/server deve essere presente uno CMD o ENTRYPOINT che determina quale comando viene eseguito quando viene eseguita l'immagine. Puoi mettere un wrapper attorno a quel comando che costruirà la variabile REDIS_URL. Qualcosa di simile a questo:

#!/bin/sh 
export REDIS_URL="redis://${REDIS_PORT_6379_TCP_ADDR}:${REDIS_PORT_6379_TCP_PORT}/0" 
<run command> 

utilizzare lo script involucro come il CMD o ENTRYPOINT nel Dockerfile.

+1

Ha senso. Ho finito per esportare REDIS_URL = $ {REDIS_URL: - "redis: // $ REDIS_PORT_6379_TCP_ADDR: $ REDIS_PORT_6379_TCP_PORT/0"} 'in modo da poter mantenere la funzionalità di entrambi. Grazie! –

2

Lasciami vagare leggermente fuori tema in un primo momento. Se si desidera convertire una variabile env in una variabile CLI, è possibile evitare uno script wrapper mediante la valutazione della variabile all'interno del contenitore finestra mobile.

docker run image /bin/bash -c '/container-command $INSIDE_DOCKER' 

Ora si può lamentare di non essere in grado di utilizzare le variabili di shell dall'esterno del contenitore. La tecnica seguente funziona in questo caso:

docker run image /bin/bash -c "/container-command $OUTSIDE_DOCKER \$INSIDE_DOCKER" 

Torna alla domanda iniziale. Se non si utilizza il comando predefinito dal Dockerfile ma invece lo si specifica, è possibile utilizzare lo stesso approccio.

docker run image /bin/bash -c "export FOO=\${INSIDE_DOCKER}; echo \$FOO" 

Il potenziale vantaggio questo ha nel tuo caso sopra l'involucro all'interno del contenitore è che involucro all'interno del contenitore è hard-coded a una porta e un nome di collegamento. Dovrebbe esserci un modo per scrivere un wrapper tutto al di fuori della finestra mobile che ispeziona le porte pubblicate (possibilmente insieme al comando predefinito) e imposta le variabili di conseguenza con il comando link in modo tale che non ci si stia affidando a nulla su hard-coding.

Problemi correlati