2017-08-03 3 views
0

Ich stelle eine Docker-Compose-Datei zusammen. Ich möchte Abschnitte, die sich wiederholen, wiederverwenden. Zum Beispiel verwendet jeder Container dieselbe deploy Config. Ich habe versucht, eine Vorlage dafür zu machen:Wiederverwendung von YAML-Abschnitten

... 
    redis: 
    image: redis 
    ports: 
     - 6379:6379 
    deploy: deploy_template 
    volumes: 
     - /srv/redis/data:/data 

deploy_template: 
    restart_policy: 
    condition: on-failure 
    delay: 5s 
    max_attempts: 10 
    window: 120s 

Allerdings hat dies nicht funktioniert. Gibt es eine Möglichkeit, dies zu tun?

Antwort

1

Sie könnten den YAML Anker und Alias-Anlage für das verwenden, effektiv:

version: '2' 
dummy: &deploy_template 
    restart_policy: 
    condition: on-failure 
    delay: 5s 
    max_attempts: 10 
    window: 120s 
services: 
    redis: 
    image: redis 
    ports: 
     - 6379:6379 
    deploy: *deploy_template 
    volumes: 
     - /srv/redis/data:/data 

als analysiert werden, wenn Sie angegeben haben:

version: '2' 
dummy: 
    restart_policy: 
    condition: on-failure 
    delay: 5s 
    max_attempts: 10 
    window: 120s 
services: 
    redis: 
    image: redis 
    ports: 
    - 6379:6379 
    deploy: 
     restart_policy: 
     condition: on-failure 
     delay: 5s 
     max_attempts: 10 
     window: 120s 
    volumes: 
    - /srv/redis/data:/data 

Sie multipe *deploy_template Werte für einen einzelnen haben kann &deploy_template Anker.

Das Problem ist jedoch, dass der Schlüssel dummy und sein Wert docker-compose auslösen, und zumindest in Version 2 gab es keinen Platz, um diese Informationen zu setzen.

ich vorverarbeiten deshalb meine docker-compose Datei ruamel.dcw (ich bin der Autor dieses Pakets) verwendet wird, die für eine user-data Top-Level-Taste ermöglicht, die nicht in der Ausgabe angezeigt werden und wo man solche Ankerinformationen setzen kann. Beginnend mit:

version: '2' 
user-data: 
    author: dthree <[email protected]> 
    description: redis container 
    env-defaults: 
    NAME: redis # default values if not specified in the environment 
    PORT: 6379 
    dummy: 
    - &deploy_template 
    restart_policy: 
     condition: on-failure 
     delay: 5s 
     max_attempts: 10 
     window: 120s 
    - &some_other_template: 
    x: null 
services: 
    redis: 
    image: ${NAME} 
    ports: 
     - "${PORT}:${PORT}" 
    deploy: *deploy_template 
    volumes: 
     - /srv/${NAME}/data:/data 

dieses expandieren zu:

version: '2' 
services: 
    redis: 
    image: ${NAME} 
    ports: 
    - ${PORT}:${PORT} 
    deploy: 
     restart_policy: 
     condition: on-failure 
     delay: 5s 
     max_attempts: 10 
     window: 120s 
    volumes: 
    - /srv/${NAME}/data:/data 

vor dem docker-compose selbst Hand sein (die -f Option). Alle Variablen im Abschnitt "env-defaults", die nicht bereits in der Umgebung festgelegt sind, in der Sie den Präprozessor ausführen, erhalten ihren Standardwert, sodass sie leicht überschrieben werden können.

Als Nebenwirkung:

- 6379:6379 

denn wenn die Portnummer unter 60 wird der alte YAML-Parser, die Andockfenster-komponieren Verwendungen, dass skalare als sexagesimal interpretiert: Sie sollten vorsichtig sein. Ich neige dazu, solche Werte immer anzugeben, besonders wenn man env verwendet. Variablen.