it-swarm.com.de

Wie können Umgebungsvariablen für Docker-RUN-Befehle von Docker-Compose verfügbar gemacht werden?

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 ich die normalen Umgebungsvariablen, wie z. B. http_proxy, in die Container kopiere, wenn sie nur im Host vorhanden sind. 

Ich kann 90% des Weges erreichen, wenn ich renne 

set | grep -i _proxy=>proxies.env

in einem Top-Level-Skript und dann in meiner Docker-compose.yml:

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

Dadurch werden die Umgebungs-Proxy-Variablen des Hosts (sofern vorhanden) in den Server-Container kopiert, und dies funktioniert in dem Sinne, dass diese Variablen zur Laufzeit des Containers verfügbar sind, dh nach der Stufe, die die Dockerfile CMD oder ENTRYPOINT ausführt.

Ich habe jedoch 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. Daher kann npm den Proxy nicht finden und hängt nicht. In anderen Arbeiten, wenn ich habe

RUN set

in meiner Docker-Datei kann ich keine Variablen von proxies.env sehen, aber wenn, dann

docker exec -it myserver /bin/bash

und dann set, kann ich alles von proxies.env sehen.

Kann jemand eine Möglichkeit empfehlen, diese Variablen zur Container-Buildzeit sichtbar zu machen, ohne dass sie hart codiert werden müssen, damit meine Docker-compose.yml- und Dockerfile-Datei weiterhin sowohl für Hosts mit Proxys als auch für Hosts ohne Proxys funktioniert?

(Läuft mit Centos 7, Docker Compose 1.3.1 und Docker 1.7.0)

12
Francis Norton

Vielleicht kannst du das versuchen:

Bevor Sie RUN aufrufen, ADD die .env-Datei im Image

ADD proxies.env proxies.env

dann stellen Sie Ihre RUN-Anweisung voran:

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

Dies erzeugt die folgende Ausgabe:

[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
3
armen.shimoon

Update 2016, docker-compose 1.6.2, docker 1.10+ mit einer docker-compose.yml-Version 2 :

Sie haben jetzt den args:-Unterabschnitt des build:-Abschnitts , der diese sehr interessante Möglichkeit beinhaltet:

Build-Argumente mit nur einem Schlüssel werden zu ihrem Umgebungswert auf dem Computer aufgelöst, auf dem Compose auf ausgeführt wird.

Siehe PR 2653 (Januar 2016)

Eine Möglichkeit, die Proxy-Variablen ohne sie fest zu codieren in die docker-compose.yml-Datei selbst einzuführen, ist daher mit dieser genauen Syntax:

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

Bevor Sie Docker-Compose 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

Ihre Dockerfile, die durch den docker-compose-Prozess erstellt wird, übernimmt dann automatisch die Werte der Proxy-Variablen, auch wenn der docker-compose.yml keine fest codierten spezifischen Werte enthält.

30
VonC

Möglicherweise löst Sie die Option "Umgebung" Ihr Problem. In Ihrem Docker würde die Datei zum Erstellen folgendermaßen aussehen:

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

docker-compose.yml

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

Dockerfile

ARG env

ENV NODE_ENV $env
2

Dieses Beispiel behebt YUM.

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