如何在Dockerfile CMD中使用variables?

在我的Dockerfile里面:

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

错误:

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

什么是最快捷的解决方法? Docker是否有计划在Docker的更高版本中“修复”或引入此function?

注意:如果我从Docker文件中删除CMD行,然后运行Docker容器,我可以手动从容器中运行Django-admin startproject $ PROJECTNAME,它将创build项目…

当你使用一个执行列表,如…

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

…然后Docker将直接执行给定的命令,而不涉及shell。 由于没有壳涉及,这意味着:

  • 没有可变的扩展
  • 没有通配符扩展
  • 没有使用><| I / Oredirect 等等
  • 没有多个命令通过command1; command2 command1; command2
  • 等等。

如果你想让你的CMD扩展variables,你需要安排一个shell。 你可以这样做:

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

或者你可以使用一个简单的string,而不是一个执行列表,这会得到与前面的例子大致相同的结果:

 CMD django-admin startproject $PROJECTNAME 

比方说,你想在一个容器内启动一个java进程。 在这种情况下,您需要更多的选项,并且您希望直接启动进程(例如,在没有tomcat的情况下使用catalina.sh包装器)。 首先使用catalina.sh包装器启动进程。 然后在容器中使用ps ef | less获取进程的执行语句。 现在细分选项和命令部分,这将是你的新CMD。

示例Dockerfile摘录:

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

示例entrypoint.sh摘录:

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