web-dev-qa-db-fra.com

Comment utiliser une variable dans un CMD Dockerfile?

Dans mon fichier Docker:

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

Erreur:

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

Quelle est la solution la plus rapide ici? Docker a-t-il l'intention de "réparer" ou d'introduire cette fonctionnalité dans les versions ultérieures de Docker?

NOTE: Si je supprime la ligne CMD du fichier Docker puis exécute le conteneur Docker, je peux exécuter manuellement Django-admin startproject $ PROJECTNAME à l'intérieur du conteneur et le projet sera créé ...

36
david

Lorsque vous utilisez une liste d'exécution, comme dans ...

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

... alors Docker exécutera la commande donnée directement, sans impliquer de shell. Comme il n'y a pas de Shell impliqué, cela signifie:

  • Aucune expansion variable
  • Aucune extension générique
  • Pas de redirection d'E/S avec >, <, |, etc.
  • Pas de commandes multiples via command1; command2
  • Et ainsi de suite.

Si vous voulez que votre CMD développe les variables, vous devez vous procurer un shell. Vous pouvez faire ça comme ça:

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

Ou vous pouvez utiliser une simple chaîne au lieu d'une liste d'exécution, ce qui vous donne un résultat largement identique à l'exemple précédent:

CMD Django-admin startproject $PROJECTNAME
61
larsks

Disons que vous voulez démarrer un processus Java dans un conteneur:

Exemple extrait de Dockerfile:

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

Exemple entrypoint.sh extrait:

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

Si vous souhaitez utiliser la valeur dans le Runtime, définissez la valeur ENV dans le fichier Docker, Si vous souhaitez l'utiliser pendant la génération, vous pouvez directement utiliser ARG.

Exemple :

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

Transmettez la valeur dans la commande de construction Docker build -t tagName --build-arg value = "jarName"

1
rex roy