在插值和转义美元 ($) 符号后保留 single/double 引号

Preserve single/double quotes around value after interpolation and escape dollar($) sign

我有 docker-compose 文件并尝试提供这样的环境变量:

    environment:
      {{ envs | to_nice_yaml(indent=2) | indent(width=6) }}

除了一个环境变量 SPRING_SECURITY_USER_PASSWORD: b$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS 的值中包含 $ 和其他特殊字符外,总体来说还不错。当我尝试 运行 服务时 $ 导致 bash 插值问题,因为它试图替换不存在的变量。如何将此值包装成单个配额并转义 $ 符号?

我已经尝试过的:

如何获得这样的值 SPRING_SECURITY_USER_PASSWORD: '$b$$$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS' $ 使用 $ 转义并使用 '

包装文字

我找到了肮脏的解决方法

{{ envs | to_nice_json | regex_replace('\$', '$$') | from_json | to_nice_yaml(indent=2) | indent(width=6) }}

它只转义 $ 但足以让 docker-compose 开心。希望它能帮助别人。

使用 jinja2 脚本的另一个更可靠的解决方案:

    environment:
{% for name, value in envs.items() %}
{%  if value is string %}
{%    if not value.startswith('\'') and not value.startswith('"') %}
      {{ name }}: '{{ value | replace('$', '$$') }}'
{%    else %}
      {{ name }}: {{ value | replace('$', '$$') }}
{%    endif %}
{%  else %}
      {{ name }}: {{ value }}
{%  endif %}
{% endfor %}

这也是工作