2015-01-07 14 views
35

Se si dispone di un contenitore finestra mobile che ho avviato da qualche tempo, qual è il modo migliore per impostare una variabile di ambiente in quel contenitore in esecuzione? Ho impostato inizialmente una variabile d'ambiente quando ho eseguito il comando run.Come impostare una variabile di ambiente in un contenitore mobile in esecuzione

$ docker run --name my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpress 

ma ora che è in corso da un po 'ho voglia di aggiungere un altro VIRTUAL_HOST alla variabile d'ambiente. Non voglio cancellare il contenitore e quindi rieseguirlo con la variabile di ambiente che voglio perché poi dovrei migrare i vecchi volumi nel nuovo contenitore, ha file di temi e caricamenti al suo interno che non voglio perdere.

Vorrei solo modificare il valore della variabile di ambiente VIRTUAL_HOST.

+0

non è possibile cambiare il variabili di ambiente di un processo in esecuzione, tranne all'interno di quel processo stesso. Questo potrebbe essere (reso possibile) consentendo di aggiornare la configurazione della variabile di ambiente (tramite 'aggiornamento docker) e quindi riavviare il contenitore. – cpuguy83

risposta

10

Docker non offre questa funzionalità.

Ci

è un problema: "How to set an enviroment variable on an existing container? #8838"

anche da "Allow docker start to take environment variables #7561":

In questo momento Docker non può cambiare la configurazione del contenitore una volta che è creato, e in generale questo è OK perché è banale creare un nuovo contenitore.

+0

Ahh, questo fa schifo. Troverò un modo. È banale creare un nuovo contenitore, ma non è banale prendere i volumi da un vecchio contenitore e montarli in un nuovo contenitore. Non voglio perdere la mia directory di wp-content. Non è così difficile spostarsi manualmente sui volumi, ma sto cercando di automatizzare le cose in modo da sconfiggere lo scopo. Forse potrei scrivere una funzione python che faccia questo. https://gist.github.com/anonymous/68f4138261fdb73a6e79 –

+1

Potresti utilizzare un contenitore separato di soli dati e "volumi-da"? – Bryan

22

ci sono Generaly due opzioni, perché finestra mobile non supporta la funzionalità ora:

  1. Crea il tuo script, che agirà come corridore per il vostro comando. Per esempio:

    #!/bin/bash 
    export VAR1=VAL1 
    export VAR2=VAL2 
    your_cmd 
    
  2. eseguire il comando seguente modo:

    docker exec -i CONTAINER_ID /bin/bash -c "export VAR1=VAL1 && export VAR2=VAL2 && your_cmd" 
    
+0

Ora che sono passati circa 2,5 anni, è ancora il modo migliore di fare le cose o la finestra mobile consente un approccio più diretto? –

4

Per un caso d'uso un po 'stretta, docker issue 8838 menzioni questa sorta-di-hack:

È basta arrestare il daemon docker e modificare la configurazione del contenitore in /var/lib/docker/containers/[container-id]/config.json (sic)

Questa soluzione aggiorna le variabili di ambiente senza la necessità di eliminare e rieseguire il contenitore, dovendo migrare i volumi e ricordare i parametri su run.

Tuttavia, ciò richiede il riavvio del daemon docker. E, finché non viene risolto il problema issue 2658, questo include un riavvio di tutti i contenitori.

1

Hai scritto che non vuoi migrare i vecchi volumi. Suppongo che sia lo Dockerfile che è stato utilizzato per creare l'immagine spencercooley/wordpress sia definito da VOLUME s o che siano stati specificati sulla riga di comando con lo switch -v.

si potrebbe semplicemente iniziare un nuovo contenitore che importa i volumi da quello vecchio con la --volumes-from switch come:

$ docker run --name my-new-wordpress --volumes-from my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpres 

in modo da avere un contenitore fresco, ma di non perdere i vecchi dati. Non è nemmeno necessario toccarlo o migrarlo.

Un contenitore ben fatto è sempre senza stato. Ciò significa che il suo processo dovrebbe aggiungere o modificare solo file su volumi definiti. Questo può essere verificato con un semplice docker diff <containerId> dopo che il contenitore ha funzionato per un po '.

In tal caso, non è pericoloso quando si ricrea il contenitore con gli stessi parametri (nel proprio caso leggermente modificati). Supponendo che tu lo crei esattamente dalla stessa immagine da cui è stato creato il vecchio e riutilizzi gli stessi volumi con l'interruttore sopra menzionato.

Dopo che il nuovo contenitore è stato avviato correttamente e si è verificato che tutto funziona correttamente, è possibile eliminare il vecchio contenitore wordpress. I vecchi volumi vengono quindi inviati dal nuovo contenitore e non verranno eliminati.

1

In primo luogo è possibile impostare env all'interno del contenitore nello stesso modo in cui si fa su una macchina Linux.

In secondo luogo, è possibile farlo modificando il file di configurazione del contenitore docker (/var/lib/docker/containers/xxxx/config.v2.json). Nota che è necessario riavviare il servizio docker per avere effetto. In questo modo è possibile modificare alcune altre cose come la mappatura delle porte ecc

1

A:

  1. impostare molti ENV. vars in un unico passaggio,
  2. impedire loro di esporre nella storia 'sh', come con l'opzione '-e' (passando token di credenziali/API!),

è possibile utilizzare

- key_value_file.txt ENV file

opzione:

docker run --env-file key_value_file.txt $INSTANCE_ID 
Problemi correlati