2015-07-03 10 views
12

Ich habe eine Dockerized-Anwendung, die ich in Proxy-und Nicht-Proxy-Host-Umgebungen ausführen möchte. Ich versuche, dieses Problem zu lösen, indem Sie die normalen Umgebungsvariablen wie http_proxy in die Container kopieren, wenn und nur wenn sie im Host vorhanden sind.Wie können Umgebungsvariablen für Docker RUN-Befehle von docker-compose bereitgestellt werden?

ich da 90% der Art und Weise bekommen

set | grep -i _proxy=>proxies.env 

in einem Top-Level-Skript, indem ausgeführt wird, und dann, mit in meiner Docker-compose.yml:

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

Diese kopiert Die Umgebungs-Proxy-Variablen des Hosts, falls vorhanden, in den Server-Container, und es funktioniert in dem Sinne, dass diese Variablen zur Laufzeit des Containers verfügbar sind, dh in der Phase, in der das Dockerfile CMD oder ENTRYPOINT ausgeführt wird.

Allerdings habe ich einen Container, der npm als Build-Schritt ausführen muss, dh von einem RUN-Befehl in der Dockerfile, und diese Variablen scheinen zu diesem Zeitpunkt nicht vorhanden zu sein, also kann npm den Proxy nicht finden und hängt . In anderen Arbeiten, wenn ich

RUN set 

in meinem Dockerfile habe, kann ich keine Variablen von proxies.env sehen, aber wenn ich

docker exec -it myserver /bin/bash 

tun und stellen Sie dann laufen, kann ich alles sehen von proxies.env.

Kann jemand eine Möglichkeit empfehlen, diese Variablen zur Container-Build-Zeit sichtbar zu machen, ohne sie hart codieren zu müssen, damit mein docker-compose.yml und Dockerfile immer noch für Hosts mit Proxies und Hosts ohne Proxies funktionieren?

(Laufen mit CentOS 7, Docker-komponieren 1.3.1 und 1.7.0 Docker)

+0

Die Generierung Ihrer Docker-Datei mit den vordefinierten env-Variablen scheint mir der einfachste Weg zu sein. –

+0

Sie können gut sein. In Ermangelung eines besseren Vorschlags werde ich ein Shell-Skript zusammenstellen, das sed verwendet, um die fest codierten NPM sed-Einstellungen zu füllen oder zu kommentieren, sodass ich dieselbe Docker-Datei sowohl für Cloud- als auch für Unternehmens-Hosts verwenden kann. –

+2

Update: mit 'docker-compose.yml' Version 2 (Docker 1.10+) haben Sie jetzt eine bessere Option:' build:/args: '. Siehe [meine Antwort unten] (http://stackoverflow.com/a/36084324/6309) – VonC

Antwort

3

Vielleicht können Sie versuchen, diese:

Bevor Sie anrufen RUN, ADD die .env-Datei in das Bild

ADD proxies.env proxies.env 

dann RUN Präfix Anweisung:

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

Dies ergibt Folgendes Ausgang:

[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

können wir ENV ENV JAVA_HOME $ nicht tun (Alternativen - Liste | grep javac | awk '{print $ 3}' | sed -e "s/\/bin \/javac // g") ???? –

+0

Das löst das Problem für mich - es stellt die env-Variablen zum Zeitpunkt der Erstellung für den Container zur Verfügung – FeifanZ

+1

Diese Antwort löst das Problem, nur beachten Sie, dass dies bricht die Philosophie der Erstellung von "Docker Images" ... – nanounanue

4

Sie Mai werden die "Umwelt" Option Ihr Problem löst. In Ihrer Docker compose Datei würde wie folgt aussieht:

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

welche Version des Yml bitte? –

25

-Update 2016 Docker-komponieren 1.6.2, Docker 1.10+, mit einem docker-compose.yml version 2:

Sie jetzt die args: sub-section des build: section haben, die das sehr interessante Möglichkeit beinhaltet:

Erstellungsargumente mit nur einem Schlüssel werden auf dem Computer in den Umgebungswert aufgelöst Compose läuft unter.

Siehe PR 2653 (Januar 2016)

Als Ergebnis eine Möglichkeit, die Proxy-Variablen einzuführen ohne Hartcodierung sie in der docker-compose.yml Datei selbst ist mit dieser genauen Syntax:

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

Bevor Sie docker-compose up aufrufen, müssen Sie sicherstellen, dass Ihre Proxy-Umgebungsvariablen gesetzt sind:

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 

Dann Ihre Dockerfile durch den Prozess docker-compose gebaut wird automatisch die Proxy-Variablen Werte übernehmen, obwohl die docker-compose.yml keine hard-codierte spezifische Werte enthält.

+1

Was passiert, wenn das Host-Env die Build-Argumente nicht liefern kann und nicht über CLI geliefert wird? – Aznim

1

docker-compose.yml

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

Dockerfile

ARG env 

ENV NODE_ENV $env 
+0

Dies ist die beste Antwort. – noun

0

Dieses Beispiel behebt YUM.

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