在插值和转义美元 ($) 符号后保留 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: "{{ spring_security_user_password | password_hash('bcrypt', rounds=10) }}"
-> b$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS
SPRING_SECURITY_USER_PASSWORD: '"{{ spring_security_user_password | password_hash('bcrypt', rounds=10) }}"'
-> '"b$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS"'
不知道为什么它同时保留了 ' 和 "
SPRING_SECURITY_USER_PASSWORD: "{{ spring_security_user_password | password_hash('bcrypt', rounds=10) | quote }}"
-> '''b$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS'''
不知道为什么要添加三重 '
SPRING_SECURITY_USER_PASSWORD: " {{ spring_security_user_password | password_hash('bcrypt', rounds=10) }} "
-> ' b$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS '
yoohoo 我把它包装成 ',但它添加了额外的空格 - 为什么?
如何获得这样的值 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 %}
这也是工作
我有 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: "{{ spring_security_user_password | password_hash('bcrypt', rounds=10) }}"
->b$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS
SPRING_SECURITY_USER_PASSWORD: '"{{ spring_security_user_password | password_hash('bcrypt', rounds=10) }}"'
->'"b$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS"'
不知道为什么它同时保留了 ' 和 "SPRING_SECURITY_USER_PASSWORD: "{{ spring_security_user_password | password_hash('bcrypt', rounds=10) | quote }}"
->'''b$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS'''
不知道为什么要添加三重 'SPRING_SECURITY_USER_PASSWORD: " {{ spring_security_user_password | password_hash('bcrypt', rounds=10) }} "
->' b$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS '
yoohoo 我把它包装成 ',但它添加了额外的空格 - 为什么?
如何获得这样的值 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 %}
这也是工作