2015-07-03 45 views
12

Ho un'applicazione Dockerised che vorrei eseguire in ambienti host proxy e non proxy. Sto cercando di risolvere questo problema copiando le normali variabili di ambiente, come http_proxy, nei contenitori se e solo se esistono nell'host.Come rendere disponibili le variabili ambientali per i comandi di Docker RUN da docker-compose?

posso ottenere il 90% della strada c'è eseguendo

set | grep -i _proxy=>proxies.env 

in uno script di alto livello, e poi avere, nella mia finestra mobile-compose.yml:

myserver: 
    build: ./myserver 
    env_file: 
    - proxies.env 

Questo copia le eventuali variabili del proxy ambientale dell'host nel contenitore del server e funziona nel senso che queste variabili sono disponibili in fase di esecuzione del contenitore, in altre parole dallo stadio in cui vengono eseguiti il ​​file Dockerfile CMD o ENTRYPOINT.

Tuttavia, ho un contenitore che deve eseguire npm come passo di costruzione, ovvero da un comando RUN nel Dockerfile, e queste variabili non sembrano essere presenti in questa fase, quindi npm non riesce a trovare il proxy e si blocca . In altri lavori, se ho

RUN set 

nel mio Dockerfile, non riesco a vedere alcuna variabile da proxies.env, ma se lo faccio

docker exec -it myserver /bin/bash 

e poi correre insieme, posso vedere tutto da proxies.env.

Qualcuno può consigliare un modo per rendere queste variabili visibili al momento della compilazione del contenitore, senza doverli codificare manualmente, in modo che il mio docker-compose.yml e Dockerfile funzionino ancora sia per gli host con proxy che per gli host senza proxy?

(Running with CentOS 7, finestra mobile-comporre 1.3.1 e finestra mobile 1.7.0)

+0

Generare il file docker con le variabili env predefinite sembra il modo più semplice per me. –

+0

Potresti avere ragione. In assenza di un suggerimento migliore, metterò insieme uno script di shell che userà sed per popolare o commentare le impostazioni di codifica NPM hard-coded, così posso usare lo stesso Dockerfile sia per gli host cloud che per quelli aziendali. Aggiornamento –

+2

: con 'docker-compose.yml' versione 2 (finestra mobile 1.10+), ora avete un'opzione migliore:' build:/args: '. Vedi [la mia risposta sotto] (http://stackoverflow.com/a/36084324/6309) – VonC

risposta

3

Forse si può provare questo:

Prima di chiamare RUN, ADD il file .env nell'immagine

ADD proxies.env proxies.env 

fare precedere la corsa dichiarazione:

RUN export `cat proxies.env` && echo "FOO is $FOO and BAR is $BAR" 

Questo produce il seguente Uscita:

[email protected]:~/Dockers/set-env# docker build -t ashimoon/envtest . 
Sending build context to Docker daemon 3.584 kB 
Sending build context to Docker daemon 
Step 0 : FROM ubuntu 
---> 91e54dfb1179 
Step 1 : ADD proxies.env proxies.env 
---> Using cache 
---> 181d0e082e65 
Step 2 : RUN export `cat proxies.env` && echo "FOO is $FOO and BAR is $BAR" 
---> Running in 30426910a450 
FOO is 1 and BAR is 2 
---> 5d88fcac522c 
Removing intermediate container 30426910a450 
Successfully built 5d88fcac522c 
+0

non possiamo fare ENV ENV JAVA_HOME $ (alternative --list | grep javac | awk '{print $ 3}' | sed -e "s/\/bin \/javac // g") ???? –

+0

Questo risolve il problema per me - rende le variabili env disponibili al momento della compilazione per il contenitore – FeifanZ

+1

Questa risposta risolve il problema, basta notare che questo rompe la filosofia della creazione di immagini 'docker' ... – nanounanue

4

può essere che l'opzione "ambiente" risolve il problema. Nel file composizione finestra mobile sarebbe assomiglia:

myserver: 
    build: ./myserver 
    environment: 
    - HTTP_PROXY=192.168.1.8 
    - VARIABLE=value 
    - ... 
+0

quale versione di yml per favore? –

25

Aggiornamento 2016, finestra mobile-comporre 1.6.2, finestra mobile 1.10+, con un docker-compose.yml version 2:

ora avete la args: sub-section del build: section, che comprende che molto interessante possibilità:

Gli argomenti di compilazione con solo una chiave vengono risolti nel loro valore di ambiente sulla macchina Compose è in esecuzione su.

Vedi PR 2653 (gennaio 2016)

Di conseguenza, un modo per introdurre le variabili proxy senza codificare li nel file docker-compose.yml stesso è con quella precisa sintassi:

version: '2' 
services: 
    myservice: 
    build: 
     context: . 
     args: 
     - http_proxy 
     - https_proxy 
     - no_proxy 

Prima di chiamare docker-compose up, è necessario assicurarsi che le variabili di ambiente proxy siano impostate:

export http_proxy=http://username:[email protected]:port 
export https_proxy=http://username:[email protected]:port 
export no_proxy=localhost,127.0.0.1,company.com 

docker-compose up 

Quindi il tuo Dockerfile creato dal processo docker-compose raccoglierà automaticamente i valori delle variabili proxy, anche se lo docker-compose.yml non include valori specifici codificati.

+1

Cosa succede se l'env dell'host non può fornire gli argomenti di compilazione e non viene fornito via cli? – Aznim

1

docker-compose.yml

... 
server: 
    build: . 
    args: 
    env: $ENV 
... 

Dockerfile

ARG env 

ENV NODE_ENV $env 
+0

Questa è la risposta migliore. – noun

0

Questo esempio corregge YUM.

version: '2' 
services: 
    example-service: 
    build: 
     context: . 
     args: 
     http_proxy: proxy.example.com:80 
Problemi correlati