【问题标题】:How to get proper docker-compose Multiline environment variables formatting?如何获得正确的 docker-compose Multiline 环境变量格式?
【发布时间】:2019-04-11 09:00:18
【问题描述】:

我使用官方 Wordpress 图像为我的 Wordpress 堆栈制作了一个 docker-compose.yaml,我想在 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

一切正常,但我的强迫症无法休息,直到我弄清楚为什么生成的 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: |-,但没有一个能达到我认为的效果。

【问题讨论】:

    标签: wordpress docker docker-compose yaml dockerfile


    【解决方案1】:

    在您的第一个示例中,文档第一个序列的最后一个元素是延伸到多行的plain scalar(即没有单引号或双引号)。在纯标量中,换行符被空格替换(空行被换行符替换)。

    因此,如果您想在该元素中使用换行符,则应使用(仅显示相关部分):

      - 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 完成的处理,特别是向 shell 传递内容,可以将换行符更改为空格。

    我还使用了一些程序,如果您可能必须通过以反斜杠结束每一行来转义换行符以进行“后续”处理 (\)

    【讨论】:

    • 太棒了!非常感谢@Anthon
    • 您知道如何将多行变量放入 .env 中吗?我尝试过的任何事情都失败了:/
    • 另外,上帝禁止你需要包含美元符号。 ?
    【解决方案2】:

    我更喜欢使用稍微不同的语法并尝试使用>。这。如果您需要在 env 变量中包含 json,则解决方案效果很好。有很多方法可以拥有multiline strings in 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
    

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 2017-06-18
      • 1970-01-01
      • 2022-01-01
      • 2018-02-03
      • 2019-02-25
      • 2022-06-11
      • 2018-06-19
      • 1970-01-01
      相关资源
      最近更新 更多