Como posso escapar de um sinal de $ cifrão em um arquivo de composição do docker?

97

Eu tenho um escalar YAML que está gerando o seguinte erro quando tento avaliar meu docker-compose.ymlarquivo:

ERRO: Formato de interpolação inválido para a opção "ambiente" no serviço "time_service": "$ {Time.now}"

YAML:

---
version: '2'
services:
  time_service:
    build: "."
    environment:
      TIME: "${Time.now}"

Como posso manter a mesma saída de string como escrita, mas evitar que o docker-compose a interprete como uma interpolação de string com defeito?

Nathan Hanna
fonte
1
Não é o analisador YAML que está interpretando essa string. YAML não sabe sobre ${}. A interpretação é feita por docker-composee escrita em Python, então a tag ruby ​​também era inadequada.
Anthon de
Eu removi a suposição incorreta de que este é um problema YAML. Isso fez com que pelo menos outra pessoa fosse enganada e perdesse tempo
Anthon

Respostas:

142

Você pode usar um $$(cifrão duplo) quando sua configuração precisar de um cifrão literal.

Você está atingindo a docker-composesubstituição variável, que está bem documentada aqui :

Ambos $VARIABLEe ${VARIABLE}sintaxe são suportados. Recursos estendidos de estilo de shell, como ${VARIABLE-default}e ${VARIABLE/foo/bar}, não são suportados.

Você pode usar um $$(cifrão duplo) quando sua configuração precisar de um cifrão literal. Isso também evita que o Compose interpole um valor, então a $$permite que você consulte as variáveis ​​de ambiente que você não deseja que sejam processadas pelo Compose.

docker-composeé escrito em Python, como você pode ver no github , o mecanismo de duplicação para obter o significado original de caracteres especiais pode ser encontrado em muitos programas, eu mesmo precisei usar isso, enquanto programava, já em 1984.

Anthon
fonte
38

Encontrou a resposta copiando a sugestão de %personagens desta postagem

Requer um cifrão duplo $$.

Então eu precisava "$${Time.now}", o que avalia"${Time.now}"

Nathan Hanna
fonte