¿Cómo obtener el formato adecuado de las variables de entorno multilínea docker-compose?

5 minutos de lectura

avatar de usuario
dzhi

Hice una docker-compose.yaml para mi pila de WordPress usando la imagen oficial de WordPress y quiero agregar algunas constantes personalizadas en el archivo wp-config.php automáticamente.

Siguiendo las instrucciones oficiales de la imagen termino con esto:

### 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

Todo funciona, pero mi TOC no puede descansar hasta que descubra por qué el wp-config.php generado se ve así: WORDPRESS_CONFIG_EXTRA constantes unidas en una línea:

// 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_');

..en lugar de esto, formateado con cada constante en una nueva línea que es mucho más legible:

// 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_');

¿Alguien puede guiarme sobre cómo se manejan las variables de entorno multilínea en el archivo docker-compose, específicamente para WORDPRESS_CONFIG_EXTRA ¿variable?

Lo intenté WORDPRESS_CONFIG_EXTRA: | y WORDPRESS_CONFIG_EXTRA: |- pero ninguno funcionó como creo que debería.

avatar de usuario
Antonio

En su primer ejemplo, el último elemento de la primera secuencia del documento es un escalar simple (es decir, sin comillas simples o dobles) que se extienda a varias líneas. En un escalar simple, las nuevas líneas se reemplazan por espacios (y las líneas vacías se reemplazan por una nueva línea).

Entonces, si desea nuevas líneas dentro de ese elemento, debe usar (solo muestra la parte relevante):

  - 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

o:

  - 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

Usando |- en vez de | excluye la nueva línea final de ese elemento. Lo que intentaste ( WORDPRESS_CONFIG_EXTRA: | ) es algo completamente diferente, ya que divide el elemento escalar único en una asignación con un solo par clave-valor.

Aunque lo anterior se carga como valores de cadena con saltos de línea incrustados, aún puede suceder que el procesamiento realizado por docker-compose, en particular pasar cosas a un shell, pueda cambiar los saltos de línea en espacios.

También he usado programas en los que, si es posible que tenga que escapar de la nueva línea para el procesamiento “siguiente”, termine cada línea con una barra invertida (\)

  • ¡Impresionante! Muchas gracias @Anthon

    – dzhi

    8 de noviembre de 2018 a las 10:47

  • ¿Sabes quizás cómo se colocaría esa var multilínea en .env? Todo lo que intenté con él falló :/

    – dzhi

    08/11/2018 a las 17:50

  • Además, los dioses no permitan que necesites incluir signos de dólar. 🙄

    – patricknelson

    10 de junio de 2020 a las 3:14

Prefiero usar una sintaxis ligeramente diferente e intentar usar >. Este. La solución funciona bastante bien si necesita tener un json en sus variables env. Hay muchas formas de tener cadenas multilínea en YAML.

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

¿Ha sido útil esta solución?