Как правильно настроить многострочное форматирование переменных окружения в Docker? - PullRequest
0 голосов
/ 08 ноября 2018

Я сделал docker-compose.yaml для своего стека Wordpress, используя официальный образ Wordpress, и я хочу автоматически добавить некоторые пользовательские константы в файл wp-config.php.

Следуя официальным инструкциям к изображениям, я получаю следующее:

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

Все работает, но мой OCD не может успокоиться, пока я не выясню, почему сгенерированный wp-config.php выглядит так: WORDPRESS_CONFIG_EXTRA константы, объединенные в одну строку:

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

.. вместо этого, отформатированный с каждой константой, находящейся в новой строке, которая гораздо более читаема:

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

Может ли кто-нибудь подсказать мне, как обрабатываются многострочные переменные среды в файле docker-compose, особенно для WORDPRESS_CONFIG_EXTRA переменной?

Я пробовал WORDPRESS_CONFIG_EXTRA: | и WORDPRESS_CONFIG_EXTRA: |-, но ни один из них не работал так, как мне кажется.

1 Ответ

0 голосов
/ 08 ноября 2018

В вашем первом примере последним элементом первой последовательности документа является простой скаляр (т.е. без одинарных или двойных кавычек), который простирается на несколько строк. В простом скалярном символе новой строки заменяются пробелы (а пустые строки заменяются символом новой строки).

Так что если вы хотите, чтобы в этом элементе были символы новой строки, вы должны использовать (только отображая соответствующую часть):

  - 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

или

  - 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

Использование |- вместо | исключает последний символ новой строки из этого элемента. То, что вы попробовали (WORDPRESS_CONFIG_EXTRA: |), является чем-то совершенно другим, поскольку вы разбили один скалярный элемент на отображение с одной парой ключ-значение.

Несмотря на то, что вышеуказанное загружается как строковые значения со встроенными символами новой строки, все же может случиться так, что обработка, выполняемая docker-compose, в частности передача объектов в оболочку, может преобразовать строки в пробелы.

Я также использовал программы, в которых, если вам, возможно, придется экранировать символ новой строки для последующей обработки, заканчивая каждую строку обратной косой чертой (\)

...