如何在 Dockerfile CMD 中使用变量?

新手上路,请多包涵

在我的 Dockerfile 中:

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

错误:

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

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

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

原文由 david 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

当您使用执行列表时,如…

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

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

  • 无变量扩展
  • 没有通配符扩展
  • 没有 i/o 重定向 > , < , |
  • 没有多个命令通过 command1; command2
  • 等等。

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

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

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

 CMD django-admin startproject $PROJECTNAME

原文由 larsks 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果要在运行时使用该值,请在 --- 中设置 --- Dockerfile ENV 值。如果你想在构建时使用它,那么你应该使用 ARG

例子 :

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

在构建命令中传递值:

 docker build -t tagName --build-arg value="jarName"

原文由 rex roy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题