2015-05-27 29 views

risposta

466

È possibile passare le variabili di ambiente ai contenitori con il flag -e.

Un esempio da uno script di avvio:

sudo docker run -d -t -i -e REDIS_NAMESPACE='staging' \ 
-e POSTGRES_ENV_POSTGRES_PASSWORD='foo' \ 
-e POSTGRES_ENV_POSTGRES_USER='bar' \ 
-e POSTGRES_ENV_DB_NAME='mysite_staging' \ 
-e POSTGRES_PORT_5432_TCP_ADDR='docker-db-1.hidden.us-east-1.rds.amazonaws.com' \ 
-e SITE_URL='staging.mysite.com' \ 
-p 80:80 \ 
--link redis:redis \ 
--name container_name dockerhub_id/image_name 

Oppure, se non si vuole avere il valore sulla riga di comando dove verrà visualizzato ps, ecc, -e può tirare in il valore dall'ambiente corrente se solo dare senza la =:

sudo PASSWORD='foo' docker run [...] -e PASSWORD [...] 

Se si dispone di molte variabili di ambiente e soprattutto se sono destinate ad essere segreto, è possibile use an env-file:

$ docker run --env-file ./env.list ubuntu bash 

Il flag --env file prende un nome di file come argomento e attende ogni riga sia nel VAR = VAL formato, mimando l'argomento passato a --env. Le righe di commento devono essere preceduti soltanto con #

+0

C'è un modo più semplice per fare questo? È davvero irritante dover ricreare il contenitore con variabili diverse ogni volta. Magari conservarlo in un file? –

+10

Memorizzo i comandi di esecuzione della finestra mobile negli script della shell, (./start_staging.sh ecc.) Quindi li eseguo in remoto utilizzando Ansible. – errata

+0

Ho problemi a far funzionare la seconda versione; Ho impostato PASSWORD = foo nell'ambiente, quindi ho passato --env PASSWORD, e solo la parola "PASSWORD" appare nel config.json del contenitore; ogni altra variabile d'ambiente ha una chiave e un valore. Sto usando Docker 1.12.1. –

55

È possibile passare usando -e parametri con docker run .. comando come accennato here e come detto da @errata.
Tuttavia, l'eventuale svantaggio di questo approccio è che le credenziali verranno visualizzate nell'elenco del processo, dove viene eseguito.
Per rendere più sicuro, è possibile scrivere le credenziali in un file di configurazione e fare docker run con --env-file come indicato here. Quindi puoi controllare l'accesso a quel file di configurazione, in modo che altri utenti che hanno accesso a quella macchina non vedano le tue credenziali.

+2

Ho aggiunto un altro modo per risolvere questo problema con la risposta di @ errata. – Bryan

+8

Fai attenzione a '--env-file', quando usi' --env' i tuoi valori di env saranno quotati/fugati con la semantica standard di qualunque shell stai usando, ma quando usi '--env-file' il i valori che otterrai all'interno del tuo contenitore saranno diversi. Il comando di esecuzione finestra mobile legge semplicemente il file, esegue l'analisi di base e passa i valori al contenitore, non è equivalente al modo in cui si comporta la shell. Solo un piccolo trucco per sapere se stai convertendo un gruppo di voci '--env' in un' --env-file'. – Shorn

+1

Per elaborare la risposta di Shorn, quando si utilizzava il file env, dovevo mettere il valore di una variabile d'ambiente molto lunga tutto su una riga poiché non sembra esserci un modo per inserire un'interruzione di riga in essa, o dividerla in più righe come: $ MY_VAR = roba $ MY_VAR = $ MY_VAR più roba –

32

Se si utilizza "docker-compose" come metodo per far ruotare i contenitori, esiste effettivamente un modo utile per passare una variabile di ambiente definita sul server al contenitore Docker.

Nel file docker-compose.yml, diciamo che girano su un contenitore di base Hapi-js e il codice è simile:

hapi_server: 
    container_name: hapi_server 
    image: node_image 
    expose: 
    - "3000" 

Diciamo che il server locale che il progetto finestra mobile è su ha una variabile d'ambiente chiamato 'NODE_DB_CONNECT' che vuoi passare al tuo contenitore hapi-js, e vuoi che il suo nuovo nome sia 'HAPI_DB_CONNECT'. Poi nel file docker-compose.yml, si dovrebbe passare la variabile ambiente locale al contenitore e rinominarlo in questo modo:

hapi_server: 
    container_name: hapi_server 
    image: node_image 
    environment: 
    - HAPI_DB_CONNECT=${NODE_DB_CONNECT} 
    expose: 
    - "3000" 

Spero che questo aiuta ad evitare codificare un database stringa di connessione in qualsiasi file nel vostro contenitore!

9

Utilizzare -e o valore --env per impostare le variabili di ambiente (predefinito []).

Un esempio da uno script di avvio:

docker run -e myhost='localhost' -it busybox sh 

Se si desidera utilizzare più ambienti dalla riga di comando, allora prima di ogni variabile d'ambiente usa la bandiera -e.

Esempio:

sudo docker run -d -t -i -e NAMESPACE='staging' -e PASSWORD='foo' busybox sh 

Nota: Assicurati che mettere il nome del contenitore, dopo la variabile d'ambiente, non prima.

Se è necessario impostare molte variabili, utilizzare il --env-file bandiera

Per esempio,

$ docker run --env-file ./my_env ubuntu bash 

Per qualsiasi altro aiuto, esaminare l'aiuto Docker:

$ docker run --help 

Documentazione ufficiale: https://docs.docker.com/compose/environment-variables/

5

Utilizzando docker-compose, l'esempio seguente mostra come è possibile ereditare le variabili di env della shell all'interno di docker-compose.yml e, a sua volta, qualsiasi Dockerfile chiamato da docker-compose per creare immagini. Ho trovato questo utile se dico nel comando DockerfileRUN Ho bisogno di eseguire comandi specifici per l'ambiente.

(la shell ha RAILS_ENV=development già esistente nell'ambiente)

finestra mobile-compose.yml:

version: '3.1' 
services: 
    my-service: 
    build: 
     #$RAILS_ENV is referencing the shell environment RAILS_ENV variable 
     #and passing it to the Dockerfile ARG RAILS_ENV 
     #the syntax below ensures that the RAILS_ENV arg will default to 
     #production if empty. 
     #note that is dockerfile: is not specified it assumes file name: Dockerfile 
     context: . 
     args: 
     - RAILS_ENV=${RAILS_ENV:-production} 
    environment: 
     - RAILS_ENV=${RAILS_ENV:-production} 

Dockerfile:

FROM ruby:2.3.4 

#give ARG RAILS_ENV a default value = production 
ARG RAILS_ENV=production 

#assign the $RAILS_ENV arg to the RAILS_ENV ENV so that it can be accessed 
#by the subsequent RUN call within the container 
ENV RAILS_ENV $RAILS_ENV 

#the subsequent RUN call accesses the RAILS_ENV ENV variable within the container 
RUN if [ "$RAILS_ENV" = "production" ] ; then echo "production env"; else echo "non-production env: $RAILS_ENV"; fi 

In questo modo non ho bisogno per specificare le variabili di ambiente nei file o docker-composebuild/up comandi:

docker-compose build 
docker-compose up 
Problemi correlati