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

Time:04-11

I have docker-compose file and try to provide environment variable like this:

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

Overall it's fine except one env var SPRING_SECURITY_USER_PASSWORD: $2b$10$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS which contains $ in its value and other special characters. $ causes an bash interpolation issue when I try to run services, because it tried to substitute variable which doesn't exist. How to wrap this value into single quotas and escape $ sign?

What I tried already:

  • SPRING_SECURITY_USER_PASSWORD: "{{ spring_security_user_password | password_hash('bcrypt', rounds=10) }}" -> $2b$10$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS

  • SPRING_SECURITY_USER_PASSWORD: '"{{ spring_security_user_password | password_hash('bcrypt', rounds=10) }}"' -> '"$2b$10$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS"' no idea why it preserved both ' and "

  • SPRING_SECURITY_USER_PASSWORD: "{{ spring_security_user_password | password_hash('bcrypt', rounds=10) | quote }}" -> '''$2b$10$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS''' not idea why it add triple '

  • SPRING_SECURITY_USER_PASSWORD: " {{ spring_security_user_password | password_hash('bcrypt', rounds=10) }} " -> ' $2b$10$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS ' yoohoo I wrapped it into ', but it added extra whitespace - why?

How can I get value like this SPRING_SECURITY_USER_PASSWORD: '$$2b$$10$$J82IHSFuwneniWNTrkn8RO2N9Gjvi3juBa805IGyqR/y/w0as29VS' $ escapped using $ and literal wrapped using '

CodePudding user response:

I found dirty workaround

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

It escapes $ only but it's enough to make docker-compose happy. Hope it will help someone else.

CodePudding user response:

Another more reliable solution using jinja2 script:

    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 %}

which also does the work

  • Related