webentwicklung-frage-antwort-db.com.de

Wie kann ich eine Variable in einem Dockerfile-CMD verwenden?

In meinem Dockerfile:

ENV PROJECTNAME mytestwebsite
CMD ["Django-admin", "startproject", "$PROJECTNAME"]

Error:

CommandError: '$PROJECTNAME' is not a valid project name

Was ist die schnellste Abhilfe hier? Hat Docker die Absicht, diese Funktion in späteren Versionen von Docker zu "reparieren" oder einzuführen?

HINWEIS: Wenn ich die CMD-Zeile aus der Docker-Datei entferne und dann den Docker-Container ausführte, kann ich Django-admin startproject $ PROJECTNAME manuell aus dem Container ausführen und das Projekt wird erstellt.

36
david

Wenn Sie eine Ausführungsliste verwenden, wie in ...

CMD ["Django-admin", "startproject", "$PROJECTNAME"]

... dann führt Docker den angegebenen Befehl direkt aus, ohne eine Shell zu involvieren. Da es keine Shell gibt, bedeutet das:

  • Keine variable Erweiterung
  • Keine Platzhaltererweiterung
  • Keine I/O-Umleitung mit >, <, | usw
  • Keine mehrfachen Befehle über command1; command2
  • Und so weiter.

Wenn Sie möchten, dass CMD Variablen erweitert, müssen Sie eine Shell einrichten. Das kannst du so machen:

CMD ["sh", "-c", "Django-admin startproject $PROJECTNAME"]

Oder Sie können eine einfache Zeichenfolge anstelle einer Ausführungsliste verwenden, wodurch Sie ein weitgehend identisches Ergebnis wie im vorherigen Beispiel erhalten:

CMD Django-admin startproject $PROJECTNAME
61
larsks

Angenommen, Sie möchten einen Java-Prozess in einem Container starten:

Beispiel Dockerfile-Auszug:

ENV Java_OPTS -XX +UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm 
... 
ENTRYPOINT ["/sbin/tini", "--", "entrypoint.sh"] 
CMD ["Java", "${Java_OPTS}", "-myargument=true"]

Beispiel entrypoint.sh Auszug:

#!/bin/sh 
... 
echo "*** Startup $0 suceeded now starting service using eval to expand CMD variables ***"
exec su-exec mytechuser $(eval echo "[email protected]")
2
Flavio Aiello

Wenn Sie den Wert in Runtime verwenden möchten, setzen Sie den ENV-Wert in Dockerfile, Wenn Sie ihn während des Builds verwenden möchten, können Sie ARG direkt verwenden

Beispiel:

ARG-Wert ENV envValue = $ value CMD ["sh", "-c", "Java-$ $ {envValue} .jar"]

Übergeben Sie den Wert im Buildbefehl Docker Build -t TagName --build-arg value = "jarName"

1
rex roy