Dado um arquivo YAML, example.yaml
:
services:
api:
image: myImage
ports:
- 8080:8080
environment:
- "TEST_STRING_WITH_SPACE=?"
Preciso substituir o TEST_STRING_WITH_SPACE
valor da variável de ambiente por um parâmetro de string de múltiplas palavras. O esperado é assim:
services:
api:
image: myImage
ports:
- 8080:8080
environment:
- "TEST_STRING_WITH_SPACE=With Space"
Estou usando yq
a ferramenta, versão:
yq (https://github.com/mikefarah/yq/) version v4.44.5
Quando tento definir um valor com uma string sem espaço, funciona:
yq '.services.api.environment[0] = "TEST_STRING_WITH_SPACE='$(echo "WithoutSpace")'"' example.yaml
Mas, quando tento definir um valor com uma string com espaço, não funciona:
yq '.services.api.environment[0] = "TEST_STRING_WITH_SPACE='$(echo "With Space")'"' example.yaml
Recebi o erro:
Erro: 1:32: texto de entrada inválido ""TEST_STRING_WIT..."
Como consertar isso?
Você precisa usar a
strenv()
função para isso. Ela é útil ao ler e atualizar caracteres especiais em atribuições, que de outra forma não seriam possíveis de definir diretamente.produz,
Isso é semelhante à solução de Inian , mas não menciona a variável na
yq
expressão. Em vez disso, ele tenta substituir o valor dado por uma variável de ambiente existente com o mesmo nome encontrado no primeiro elemento doenvironment
array.O
sub
comando trunca o valor do elemento da matriz no primeiro=
e, em seguida, o substitui por uma atribuição no formuláriovar=${var}
, queenvsubst
posteriormente opera.Os parâmetros usados com
envsubst
garantem que o comando falhe normalmente se a variável de ambiente não estiver definida.Testando com o arquivo YAML fornecido na pergunta:
Um teste com falha (variável de ambiente não definida):
Ao aplicar a operação a todo o array, poderíamos substituir vários valores: