2017-02-15 2 views
2

Wenn ich Docker-compose Build betreibe ich eine .env-Datei für den Aufbau von Umgebungsvariablen auf meinem Docker-Maschine wie folgt verwendet werden:Docker .env Datei Wiederverwendung deklarierten Variablen

COMPOSE_PROJECT_NAME=radar 
ENV=production 
DB_NAME=postgres 
DB_USER=postgres 
DB_PASS=sho1c2ov3Phezaimah7eb2Tii4ohkah8k 
DB_SERVICE=postgres 
DB_PORT=5432 
C_FORCE_ROOT="true" 
PGHOST=postgres 
PGDATABASE=postgres 
PGUSER=postgres 
PGPASSWORD=sho1c2ov3Phezaimah7eb2Tii4ohkah8k 
PGPORT=5432 

Wenn Sie das bemerkt Redundanz wie die 'DB_NAME' und 'PGDATABASE' ist die gleiche .. Gibt es eine Möglichkeit, dies zu vermeiden?

Antwort

2

Was ist in Ihrem Dockerfile so etwas wie dies zu tun:

ARG DB_NAME 
ENV DB_NAME=${DB_NAME} PGDATABASE=${DB_NAME} ... 

-Test

$ cat Dockerfile 
FROM alpine:3.4 

ARG DB_NAME 
ENV DB_NAME=${DB_NAME} PGDATABASE=${DB_NAME} 

RUN env 

Compose Datei-Version 2 oder höher!

$ cat docker-compose.yml 
version: '3' #'2' should work as well 

services: 
    docker-arg-env: 
    build: 
     context: . 
     args: 
     - DB_NAME 
    command: env 

$ cat .env 
DB_NAME=world 

$ docker-compose build 
Building docker-arg-env 
Step 1/4 : FROM alpine:3.4 
---> 0766572b4bac 
Step 2/4 : ARG DB_NAME 
---> Running in a56be8426dd5 
---> 4b1009ba9fad 
Removing intermediate container a56be8426dd5 
Step 3/4 : ENV DB_NAME ${DB_NAME} PGDATABASE ${DB_NAME} 
---> Running in 5bbdd40e640e 
---> 593105981a2a 
Removing intermediate container 5bbdd40e640e 
Step 4/4 : RUN env 
---> Running in dadf204c7497 
HOSTNAME=26ba10d264c2 
SHLVL=1 
HOME=/root 
PGDATABASE=world 
DB_NAME=world 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
PWD=/ 
---> 9632ee1e0e37 
Removing intermediate container dadf204c7497 
Successfully built 9632ee1e0e37 

$ docker-compose up 
Creating network "dockerargenv_default" with the default driver 
Creating dockerargenv_docker-arg-env_1 
Attaching to dockerargenv_docker-arg-env_1 
docker-arg-env_1 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
docker-arg-env_1 | HOSTNAME=5a6b51f4ecc7 
docker-arg-env_1 | DB_NAME=world 
docker-arg-env_1 | PGDATABASE=world 
docker-arg-env_1 | HOME=/root 

Wie Sie sehen können, PG_Name und geschickt PGDATABASE während Buildzeit und Laufzeit festgelegt werden.

Ohne Compose:

docker build --build-arg DB_NAME=world . und docker run docker-arg-env:latest env produzieren das gleiche Ergebnis.

aktualisieren

Wenn Sie nicht (oder wollen nicht) die Dockerfile versuchen so etwas ändern:

$ cat .env 
hello=world 

$ cat docker-compose.yml 
version: '2' 
services: 
    app: 
    environment: 
     - bar=${hello} 
     - foo=${hello} 
    image: someimage 

$ docker-compose config 
version: '2' 
services: 
    app: 
    environment: 
     - bar=world 
     - foo=world 
    image: someimage 

See : https://docs.docker.com/compose/environment-variables/#the-env-file

+0

Haben Sie es versucht? Leider funktioniert es bei mir nicht –

+0

habe ich jetzt ;-) Beispiel ist in Antwort enthalten. – Martin

+0

Oh, ich habe komplett vergessen, dass du 'docker-compose build' benutzt hast. Sollte die Frage erneut gelesen haben. – Martin

Verwandte Themen