Jak mogę uniknąć znaku dolara $ w pliku redagowania Dockera?

90

Mam skalar YAML, który generuje następujący błąd, gdy próbuję ocenić mój docker-compose.ymlplik:

BŁĄD: Nieprawidłowy format interpolacji dla opcji „środowisko” w usłudze „usługa_czasu”: „$ {Time.now}”

YAML:

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

Jak mogę zachować te same dane wyjściowe w postaci ciągów, co napisane, ale uniknąć interpretowania ich przez docker-compose jako wadliwej interpolacji ciągów?

Nathan Hanna
źródło
1
To nie parser YAML interpretuje ten ciąg. YAML o tym nie wie ${}. Interpretacja jest wykonywana docker-composei jest napisana w Pythonie, więc tag ruby ​​również był nieodpowiedni.
Anthon
Usunąłem nieprawidłowe założenie, że jest to problem z YAML. Spowodowało to, że co najmniej jeszcze jedna osoba została wprowadzona w błąd i straciła czas
Anthon

Odpowiedzi:

130

Uderzasz w docker-composezmienną substytucję, która jest dobrze udokumentowana tutaj :

Obsługiwane są obie $VARIABLEi ${VARIABLE}składnia. Rozszerzone funkcje w stylu powłoki, takie jak ${VARIABLE-default}i ${VARIABLE/foo/bar}, nie są obsługiwane.

Możesz użyć $$(podwójnego znaku dolara), gdy konfiguracja wymaga dosłownego znaku dolara. Zapobiega to również interpolowaniu wartości przez funkcję Compose, więc a $$umożliwia odwoływanie się do zmiennych środowiskowych, których nie chcesz przetwarzać przez funkcję Compose.

docker-composejest napisany w Pythonie, jak widać na githubie , mechanizm podwojenia, aby uzyskać oryginalne znaczenie znaków specjalnych, można znaleźć w wielu programach, sam musiałem tego używać podczas programowania, już w 1984 roku.

Anthon
źródło
37

Znalazłem odpowiedź, kopiując sugestię dotyczącą %postaci w tym poście

Wymaga podwójnego znaku dolara $$.

Więc potrzebowałem "$${Time.now}", co ocenia"${Time.now}"

Nathan Hanna
źródło