Wie bekomme ich die richtige Formatierung von Docker-Compose Multiline-Umgebungsvariablen?

Lesezeit: 5 Minuten

Benutzeravatar von dzhi
dzhi

Ich machte einen docker-compose.yaml für meinen WordPress-Stack mit offiziellem WordPress-Image und ich möchte automatisch einige benutzerdefinierte Konstanten in die wp-config.php-Datei einfügen.

Wenn ich den offiziellen Bildanweisungen folge, lande ich damit:

### Web Application
  wordpress:
    container_name: 'wordpress'
    image: 'wordpress:php7.2-fpm-alpine'
    user: 1001:1001
    environment:
      - WORDPRESS_DB_HOST=mysql
      - WORDPRESS_DB_USER=something
      - WORDPRESS_DB_NAME=something
      - WORDPRESS_DB_PASSWORD=xxxxxxxxxxxxxxx
      - WORDPRESS_DEBUG=1
      - WORDPRESS_CONFIG_EXTRA=
          define( 'WP_REDIS_CLIENT', 'predis' );
          define( 'WP_REDIS_SCHEME', 'tcp' );
          define( 'WP_REDIS_HOST', 'redis' );
          define( 'WP_REDIS_PORT', '6379' );
          define( 'WP_REDIS_PASSWORD', 'xxxxxxxxxxxxxxx' );
          define( 'WP_REDIS_DATABASE', '0' );
          define( 'WP_REDIS_MAXTTL', '21600' );
          define( 'WP_CACHE_KEY_SALT', 'xx_ ');
          define( 'WP_REDIS_SELECTIVE_FLUSH', 'xx_ ');
          define( 'WP_AUTO_UPDATE_CORE', false );
    volumes:
      - ./wordpress:/var/www/html
      - ./logs/php:/var/logs/php
      - ./config/php/www.conf:/usr/local/etc/php-fpm.d/www.conf:ro
    networks:
      - frontend
      - backend
    restart: always
    depends_on:
      - mysql

Alles funktioniert, aber meine OCD kann nicht ruhen, bis ich herausgefunden habe, warum die generierte wp-config.php so aussieht: WORDPRESS_CONFIG_EXTRA Konstanten in einer Zeile verbunden:

// WORDPRESS_CONFIG_EXTRA
define('WP_REDIS_CLIENT', 'predis'); define('WP_REDIS_SCHEME', 'tcp'); define('WP_REDIS_HOST', 'redis'); define('WP_REDIS_PORT', '6379'); define('WP_REDIS_PASSWORD', 'xxxxxxxxxxxxxxx'); define('WP_REDIS_DATABASE', '0'); define('WP_REDIS_MAXTTL', '21600'); define('WP_CACHE_KEY_SALT', 'xx_'); define('WP_REDIS_SELECTIVE_FLUSH', 'xx_');

..anstatt so formatiert, dass jede Konstante in einer neuen Zeile steht, was viel besser lesbar ist:

// WORDPRESS_CONFIG_EXTRA
define('WP_REDIS_CLIENT', 'predis');
define('WP_REDIS_SCHEME', 'tcp');
define('WP_REDIS_HOST', 'redis');
define('WP_REDIS_PORT', '6379');
define('WP_REDIS_PASSWORD', 'xxxxxxxxxxxxxxx');
define('WP_REDIS_DATABASE', '0');
define('WP_REDIS_MAXTTL', '21600');
define('WP_CACHE_KEY_SALT', 'xx_');
define('WP_REDIS_SELECTIVE_FLUSH', 'xx_');

Kann mir jemand erklären, wie mehrzeilige Umgebungsvariablen in der Docker-Compose-Datei behandelt werden, insbesondere für WORDPRESS_CONFIG_EXTRA Variable?

Ich habe es versucht WORDPRESS_CONFIG_EXTRA: | und WORDPRESS_CONFIG_EXTRA: |- aber keiner hat so funktioniert, wie ich denke, dass es sollte.

Benutzeravatar von Anthon
Anton

In Ihrem ersten Beispiel ist das letzte Element der ersten Sequenz des Dokuments a einfacher Skalar (dh ohne einfache oder doppelte Anführungszeichen), die sich über mehrere Zeilen erstreckt. In einem einfachen Skalar werden Zeilenumbrüche durch Leerzeichen ersetzt (und leere Zeilen durch einen Zeilenumbruch).

Wenn Sie also Zeilenumbrüche innerhalb dieses Elements wünschen, sollten Sie Folgendes verwenden (nur den relevanten Teil anzeigen):

  - WORDPRESS_DB_PASSWORD=xxxxxxxxxxxxxxx
  - WORDPRESS_DEBUG=1
  - WORDPRESS_CONFIG_EXTRA=

      define( 'WP_REDIS_CLIENT', 'predis' );

      define( 'WP_REDIS_SCHEME', 'tcp' );

      define( 'WP_REDIS_HOST', 'redis' );

      define( 'WP_REDIS_PORT', '6379' );

      define( 'WP_REDIS_PASSWORD', 'xxxxxxxxxxxxxxx' );

      define( 'WP_REDIS_DATABASE', '0' );

      define( 'WP_REDIS_MAXTTL', '21600' );

      define( 'WP_CACHE_KEY_SALT', 'xx_ ');

      define( 'WP_REDIS_SELECTIVE_FLUSH', 'xx_ ');

      define( 'WP_AUTO_UPDATE_CORE', false );
volumes:
  - ./wordpress:/var/www/html

oder:

  - WORDPRESS_DB_PASSWORD=xxxxxxxxxxxxxxx
  - WORDPRESS_DEBUG=1
  - |
    WORDPRESS_CONFIG_EXTRA=
    define( 'WP_REDIS_CLIENT', 'predis' );
    define( 'WP_REDIS_SCHEME', 'tcp' );
    define( 'WP_REDIS_HOST', 'redis' );
    define( 'WP_REDIS_PORT', '6379' );
    define( 'WP_REDIS_PASSWORD', 'xxxxxxxxxxxxxxx' );
    define( 'WP_REDIS_DATABASE', '0' );
    define( 'WP_REDIS_MAXTTL', '21600' );
    define( 'WP_CACHE_KEY_SALT', 'xx_ ');
    define( 'WP_REDIS_SELECTIVE_FLUSH', 'xx_ ');
    define( 'WP_AUTO_UPDATE_CORE', false );
volumes:
  - ./wordpress:/var/www/html

Verwenden |- Anstatt von | schließt den letzten Zeilenumbruch aus diesem Element aus. Was du versucht hast ( WORDPRESS_CONFIG_EXTRA: | ) ist etwas völlig anderes, da Sie das einzelne skalare Element in eine Zuordnung mit einem einzelnen Schlüssel-Wert-Paar aufteilen.

Obwohl das obige als String-Werte mit eingebetteten Zeilenumbrüchen geladen wird, kann es dennoch passieren, dass die Verarbeitung durch Docker-Compose, insbesondere das Übergeben von Dingen an eine Shell, die Zeilenumbrüche in Leerzeichen umwandeln kann.

Ich habe auch Programme verwendet, bei denen Sie möglicherweise den Zeilenumbruch für die “folgende” Verarbeitung maskieren müssen, indem Sie jede Zeile mit einem Backslash beenden (\)

  • Genial! Vielen Dank @Anthon

    – dschi

    8. November 2018 um 10:47 Uhr

  • Wissen Sie vielleicht, wie man diese mehrzeilige Variable in .env einfügen würde? Alles, was ich damit versucht habe, ist fehlgeschlagen :/

    – dschi

    8. November 2018 um 17:50 Uhr

  • Außerdem verbieten die Götter, dass Sie Dollarzeichen einfügen müssen. 🙄

    – Patricknelson

    10. Juni 2020 um 3:14 Uhr

Ich bevorzuge eine etwas andere Syntax und versuche es mit >. Dies. Die Lösung funktioniert ziemlich gut, wenn Sie einen JSON in Ihren Umgebungsvariablen benötigen. Es gibt viele Möglichkeiten, mehrzeilige Zeichenfolgen in YAML zu haben.

version: '2'
services:
  wordpress:
    container_name: 'wordpress'
    image: 'wordpress:php7.2-fpm-alpine'
    user: 1001:1001
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: something
      WORDPRESS_DB_NAME: something
      WORDPRESS_DB_PASSWORD: xxxxxxxxxxxxxxx
      WORDPRESS_DEBUG: 1
      WORDPRESS_CONFIG_EXTRA: >
          define( 'WP_REDIS_CLIENT', 'predis' );
          define( 'WP_REDIS_SCHEME', 'tcp' );
          define( 'WP_REDIS_HOST', 'redis' );
          define( 'WP_REDIS_PORT', '6379' );
          define( 'WP_REDIS_PASSWORD', 'xxxxxxxxxxxxxxx' );
          define( 'WP_REDIS_DATABASE', '0' );
          define( 'WP_REDIS_MAXTTL', '21600' );
          define( 'WP_CACHE_KEY_SALT', 'xx_ ');
          define( 'WP_REDIS_SELECTIVE_FLUSH', 'xx_ ');
          define( 'WP_AUTO_UPDATE_CORE', false );
      CONFIG_ABC: >
          {
            "database": {
               "catalog": {
                   "credentials": {
                       "username": "scott",
                       "password": "tiger",
                       "datbase": "catalog",
                       "host": "gn.dmfkd.lan"
                    }
                }
            }
          }
      CONFIG_DEF: >
          {
            "urlRegex": "/.*",
            "script": {
              "scriptPath": "example-python-app.py"
            },
            "runtime": "python27",
            "threadsafe": true,
          }
    volumes:
      - ./wordpress:/var/www/html
      - ./logs/php:/var/logs/php
      - ./config/php/www.conf:/usr/local/etc/php-fpm.d/www.conf:ro
    networks:
      - frontend
      - backend
    restart: always
    depends_on:
      - mysql

1404160cookie-checkWie bekomme ich die richtige Formatierung von Docker-Compose Multiline-Umgebungsvariablen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy