2016-03-29 23 views
10

E 'possibile riutilizzare le variabili ambientali che sono condivisi tra più contenitori per evitare la duplicazione, come illustrato in questo esempio:Re-utilizzando le variabili ambientali nella finestra mobile-composizione 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

Ecco la soluzione attualmente in vigore: https://github.com/axibase/axibase-collector/blob/ master/docker-bundle.md –

risposta

20

È possibile utilizzare la direttiva extends per consentire a più contenitori di ereditare la configurazione environment da una descrizione del servizio sottostante. Per esempio, mettere il seguente in un file chiamato base.yml:

version: '2' 

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

Poi, nel tuo 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 

Poi all'interno di container1, si vedrà:

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

E dentro container2 vedrai:

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

È ovviamente possibile utilizzare extends per elementi diversi dalla direttiva environment; è un ottimo modo per evitare la duplicazione quando si usa docker-compose.

+0

'extends' funziona bene per il mio caso d'uso. È preferibile rispetto alle variabili locali perché rimuove la dipendenza da determinati utenti. Un'altra cosa che posso fare con 'extends' è specificare etichette di container comuni. –

+0

oh davvero, 'extends', come potrei mancarlo, grazie man :) –

+0

posso' estendere' più di un servizio? o da più di un file per servizio? – pkyeck

1

È possibile fare riferimento ambiente locale variabili all'interno di un file di composizione docker. Supponendo che cosa hai intenzione di fare è rendere USER_NAME lo stesso di DB_USER_NAME:

finestra mobile-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} 

Quindi, eseguire finestra mobile-comporre come:

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

alternativa , per qualcosa di più permanente e più facile da digitare su base ricorrente:

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

L'opzione extends può essere piacevole ma è not supported in 3.x comporre file. Un altro modo per andare è la direttiva env_file.

finestra mobile-compose.yml:

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

variables.env:

VARIABLE=some_value 
ANOTHER_VARIABLE=another_value 
Problemi correlati