2016-03-29 4 views
10

Ist es möglich, Umgebungsvariablen neu zu verwenden, die in diesem Beispiel Vervielfältigung unter mehreren Behältern geteilt werden, wie dargestellt, zu vermeiden:Wiederverwendung von Umgebungsvariablen in Docker-compose yml

version: '2' 

services: 

    db: 
    image: example/db 
    ports: 
     - "8443:8443" 
    container_name: db 
    hostname: db 
    environment: 
     - USER_NAME = admin 
     - USER_PASSWORD = admin 

svc: 
    image: example/svc 
    depends_on: 
    - db 
    ports: 
    - "9443:9443" 
    container_name: svc 
    hostname: svc 
    environment: 
    - DB_URL = https://db:8443 
    - DB_USER_NAME = admin 
    - DB_USER_PASSWORD = admin 
+0

Hier ist die aktuelle Lösung in Ort: https://github.com/axibase/axibase-collector/blob/ master/docker-bundle.md –

Antwort

20

Sie können die extends-Direktive verwenden, damit mehrere Container die environment-Konfiguration von einer zugrunde liegenden Dienstbeschreibung erben. Zum Beispiel setzen Sie die folgenden in einer Datei base.yml genannt:

version: '2' 

services: 
    base: 
    environment: 
     DB_URL: https://db:8443 
     DB_USER_NAME: admin 
     DB_USER_PASSWORD: admin 

Dann in Ihrem docker-compose.yml:

version: '2' 

services: 
    container1: 
    image: alpine 
    command: sh -c "env; sleep 900" 
    extends: 
     file: base.yml 
     service: base 

    container2: 
    image: alpine 
    command: sh -c "env; sleep 900" 
    extends: 
     file: base.yml 
     service: base 
    environment: 
     ANOTHERVAR: this is a test 

Dann innerhalb von container1, werden Sie sehen:

DB_URL=https://db:8443 
DB_USER_NAME=admin 
DB_USER_PASSWORD=admin 

Und innerhalb von container2 Sie werden sehen:

DB_URL=https://db:8443 
DB_USER_NAME=admin 
DB_USER_PASSWORD=admin 
ANOTHERVAR=this is a test 

Sie können natürlich extends für andere Dinge als die environment Richtlinie verwenden; Es ist eine großartige Möglichkeit, Doppelarbeit zu vermeiden, wenn Sie docker-compose verwenden.

+0

'extends' funktioniert gut für meinen Anwendungsfall. Es ist gegenüber lokalen Variablen vorzuziehen, da es die Abhängigkeit von bestimmten Benutzern entfernt. Eine andere Sache, die ich mit 'extends' machen kann, ist, allgemeine Container-Labels anzugeben. –

+0

oh wirklich, 'extends', wie könnte ich es vermissen, danke Mann :) –

+0

kann ich mehr als einen Service" verlängern "? oder aus mehr als einer Datei pro Service? – pkyeck

1

Sie lokale Umgebung verweisen können Variablen aus einer Docker-Compose-Datei. Unter der Annahme, was Sie wollen, ist zu tun USER_NAME machen das gleiche wie DB_USER_NAME:

Docker-compose.yml

version: '2' 

services: 
    db: 
    image: example/db 
    ports: 
     - "8443:8443" 
    container_name: db 
    hostname: db 
    environment: 
     - USER_NAME = ${USERNAME} 
     - USER_PASSWORD = ${PASSWORD} 

svc: 
    image: example/svc 
    depends_on: 
    - db 
    ports: 
    - "9443:9443" 
    container_name: svc 
    hostname: svc 
    environment: 
    - DB_URL = https://db:8443 
    - DB_USER_NAME = ${USERNAME} 
    - DB_USER_PASSWORD = ${PASSWORD} 

Dann laufen Docker-komponieren wie:

$ USERNAME="admin" PASSWORD="admin" docker-compose up 

Alternativ , für etwas dauerhafteres und einfacher wiederholbar zu schreiben:

$ printf '%s\n%s\n' 'export USERNAME="admin"' 'export PASSWORD="admin"' >> ~/.bash_profile 
$ source ~/.bash_profile 
$ docker-compose up 
2

Die extends Option kann nett sein, aber es ist not supported in 3.x verfassen Dateien. Ein anderer Weg zu gehen ist env_file Richtlinie.

Docker-compose.yml:

version: '3.2' 
services: 
    some_service: 
    image: someimage 
    env_file: 
     - 'variables.env' 

variables.env:

VARIABLE=some_value 
ANOTHER_VARIABLE=another_value 
Verwandte Themen