Wie kann ich einem Dollarzeichen in einer Docker-Erstellungsdatei entkommen?

90

Ich habe einen YAML-Skalar, der beim Versuch, meine docker-compose.ymlDatei auszuwerten, den folgenden Fehler auslöst:

FEHLER: Ungültiges Interpolationsformat für die Option "Umgebung" im Dienst "time_service": "$ {Time.now}"

YAML:

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

Wie kann ich die gleiche Zeichenfolgenausgabe wie geschrieben beibehalten, aber vermeiden, dass der Docker-Compose sie als fehlerhafte Zeichenfolgeninterpolation interpretiert?

Nathan Hanna
quelle
1
Es ist nicht der YAML-Parser, der diese Zeichenfolge interpretiert. YAML weiß nichts davon ${}. Das Dolmetschen erfolgt durch docker-composeund das ist in Python geschrieben, daher war das Tag Ruby ebenfalls unangemessen.
Anthon
Ich habe die falsche Annahme entfernt, dass dies ein YAML-Problem ist. Es führte dazu, dass mindestens eine andere Person in die Irre geführt wurde und Zeit verschwendete
Anthon

Antworten:

130

Sie treffen auf die docker-composevariable Substitution, die hier gut dokumentiert ist :

Sowohl $VARIABLEals auch die ${VARIABLE}Syntax werden unterstützt. Erweiterte Funktionen im Shell-Stil wie ${VARIABLE-default}und ${VARIABLE/foo/bar}werden nicht unterstützt.

Sie können ein $$(Doppel-Dollar-Zeichen) verwenden, wenn Ihre Konfiguration ein Literal-Dollar-Zeichen benötigt. Dies verhindert auch, dass Compose einen Wert interpoliert, sodass $$Sie auf Umgebungsvariablen verweisen können, die von Compose nicht verarbeitet werden sollen.

docker-composeist in Python geschrieben, wie Sie auf Github sehen , der Verdopplungsmechanismus, um die ursprüngliche Bedeutung von Sonderzeichen zu erhalten, ist in vielen Programmen zu finden. Ich musste ihn bereits 1984 beim Programmieren selbst verwenden.

Anthon
quelle
37

Finden Sie die Antwort, indem Sie den Vorschlag für %Zeichen in diesem Beitrag kopieren

Es erfordert ein doppeltes Dollarzeichen $$.

Also brauchte ich "$${Time.now}", was auswertet"${Time.now}"

Nathan Hanna
quelle