2014-12-30 16 views
34

Il mio caso d'uso specifico è che voglio organizzare alcuni dati sull'istanza EC2 su cui è in esecuzione un container e renderlo disponibile come variabile di ambiente. Mi piacerebbe farlo quando il contenitore è stato costruito.Creare variabili di ambiente dinamiche in fase di compilazione in Docker

Speravo di essere in grado di fare qualcosa come ENV VAR_NAME $(./script/that/gets/var) nel mio Dockerfile, ma non sorprende che non funzioni (hai appena ottenuto la stringa $(./script...).

Devo dire che so che lo docker run --env... farà questo, ma voglio specificatamente che venga incorporato nel contenitore.

Mi manca qualcosa di ovvio? È possibile?

+0

Quando si desidera eseguire './Script/that/gets/var'? I file Docker sono per il tempo di costruzione. Se vuoi che qualcosa venga eseguito al momento dell'avvio del contenitore, basta creare uno script che esegua './Script/that/gets/var' e quindi il comando principale. – generalhenry

+0

Voglio che venga eseguito al momento della compilazione e crei variabili di ambiente che saranno presenti in fase di esecuzione. – Evan

risposta

28

Docker v1.9 o più recente

Se si utilizza Docker v1.9 o più recente, questo è possibile tramite il supporto per gli argomenti del tempo di costruzione. Gli argomenti sono dichiarati nello Dockerfile entro il using the ARG statement.

ARG REQUIRED_ARGUMENT 
ARG OPTIONAL_ARGUMENT=default_value 

Quando in seguito realmente costruire la vostra immagine utilizzando docker build è possibile passare argomenti tramite la bandiera --build-arg come descritto nella docker docs.

$ docker build --build-arg REQUIRED_ARGUMENT=this-is-required . 

Si prega di notare che si tratta di non raccomanda di utilizzare le variabili di generazione in tempo per le password o segreti, come chiavi o credenziali.

Inoltre, le variabili di build possono avere great impact on caching. Pertanto il Dockerfile dovrebbe essere costruito con grande cura per poter utilizzare il caching il più possibile e in questo modo accelerare il processo di costruzione.

Modifica: la "finestra mobile nuova di v1.9" è stata aggiunta dopo l'immissione da leedm777:s answer.


Docker prima v1.9

Se si utilizza una finestra mobile-versione prima di 1.9, l'approccio ARG/--build-arg non era possibile. Non è stato possibile risolvere questo tipo di informazioni durante la compilazione, quindi è necessario passarle come parametri al comando docker run.

Docker immagini devono essere coerenti nel tempo mentre i contenitori possono essere modificati e considerati come "processi di espulsione".

  • Maggiori informazioni su ENV
  • uno scaricatore di porto discussione su dynamic builds

La vecchia soluzione a questo problema è stato quello di utilizzare template. Questa non è una soluzione chiara ma era una delle pochissime opzioni praticabili al momento. (Ispirazione da this discussion).

  1. salvare tutti i dati dinamici in un file JSON o YAML
  2. creare un file di finestra mobile "modello" in cui la dinamica può essere successivamente ampliato
  3. scrivere uno script che crea un Dockerfile dai dati di configurazione utilizzando alcuni libreria di template che si ha familiarità con
+0

Ri: "Lo scopo delle immagini docker è molto consistente", lo capisco ma questo riguarda specificamente il contenitore, che ha tutti i tipi di elementi dinamici in corso. – Evan

+0

Il problema con l'approccio del template per il mio caso d'uso è che l'applicazione è in esecuzione su Elastic Beanstalk e la fase di creazione è controllata dal servizio, quindi non posso ottenere il mio modello compilato nel posto a cui tengo veramente (sebbene sicuramente risolvere questo problema per altri casi d'uso). – Evan

+0

@Evan ascolta, problema difficile. Quindi la risposta è: no - non ti manca nulla di ovvio e non è possibile;) – wassgren

3

Per costruire ENV VAR_NAME $(./script/that/gets/var) nel contenitore, creano un Dockerfile dinamica in fase di compilazione:

$ docker build -t awesome -f Dockerfile . 
$ # get VAR_NAME value: 
$ VAR_VALUE=`docker run --rm awesome \ 
    bash -c 'echo $(./script/that/gets/var)'` 
$ # use dynamic Dockerfile: 
$ { 
    echo "FROM awesome" 
    echo "ENV VAR_NAME $VAR_VALUE" 
    } | docker build -t awesome - 

https://github.com/42ua/docker-autobuild/blob/master/emscripten-sdk/README.md#build-docker-image

30

Docker 1.9 has added support for build time arguments.

Nel Dockerfile, è add an ARG statement, che ha una sintassi simile a ENV.

ARG FOO_REQUIRED 
ARG BAR_OPTIONAL=something 

al momento della compilazione, è possibile passare pass a --build-arg argument per impostare l'argomento per quella costruzione. Qualsiasi ARG a cui non è stato assegnato un valore predefinito nello Dockerfile deve essere specificato.

$ docker build --build-arg FOO_REQUIRED=best-foo-ever . 
+4

Domanda laterale ... come è passato a una build su beanstalk elastico? AFAIK non è possibile fornire un comando di compilazione a una distribuzione finestra mobile su Elastic Beanstalk. – user1658296

Problemi correlati