Verwenden Sie Umgebungsvariablen in CMD

82

Kann ich Umgebungsvariablen in meiner CMD-Zeilengruppe in einer Docker-Datei verwenden?

Ich möchte so etwas machen:

CMD ["myserver", "--arg=$ARG", "--memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT"]

Wobei $ MEMCACHE_11211_TCP_ * durch die Aufnahme des Parameters --link von my automatisch gesetzt würde docker run Befehls . Und $ ARG kann vom Benutzer zur Laufzeit konfiguriert werden, möglicherweise über den Parameter "-e"?

Dies scheint bei mir nicht zu funktionieren, es scheint zum Beispiel buchstäblich durch die Zeichenfolge "$ ARG" zu gehen.

Bäche94
quelle

Antworten:

57

Diese Antwort kann etwas spät sein. Die Umgebung für CMDwird jedoch etwas anders interpretiert, je nachdem, wie Sie die Argumente schreiben. Wenn Sie das CMDals Zeichenfolge übergeben (nicht innerhalb eines Arrays), wird es als Shell anstelle von exec gestartet. Siehe https://docs.docker.com/engine/reference/builder/#cmd .

Sie können versuchen, die CMDSyntax ohne Array als Shell auszuführen:

CMD myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT
Andy Shinn
quelle
27
CMD ["sh", "-c", "echo ${MY_HOME}"]

Antwort von sffits hier .

Alex Punnen
quelle
11

Beide Andys hatten es richtig. Die JSON-Syntax umgeht den Einstiegspunkt. Wenn Sie CMD wie in ihrem Beispiel verwenden, wird dies als Argument für den Standardeinstiegspunkt betrachtet, der die Umgebungsvariablen /bin/sh -cinterpretiert.

Docker wertet die Variablen in CMD in beiden Fällen nicht aus. Im ersten Fall wird der Befehl direkt aufgerufen, sodass nichts interpretiert wird. Im zweiten Fall werden die Variablen von interpretiert sh.

knarren
quelle
7

Ich kann sprechen nicht , wie es soll an der Arbeit, aber ich denke , wenn man dies als ein Shell - Skript aufgerufen, zBCMD runmyserver.sh , dann ist die Interpretation der Shell - Variablen verschoben werden würde , bis der CMD tatsächlich lief.

Also versuche

myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT`` 

als Shell-Skript?

Andy
quelle