如何在Dockerfile CMD中使用变量?


102

在我的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,它将创建项目...


1
您如何定义和定义时间$PROJECTNAME
Piotr Wittchen '16

在我的Dockerfile开头使用ENV。我也忘了提一下,如果我从Dockerfile中删除CMD行然后运行容器,则可以从容器内部运行此命令,它将创建项目(这意味着ENV变量有效)。
大卫,2016年

您是什么类型的变量:dockerfile变量还是环境变量(如系统运行时一样)?
emix

Answers:


160

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

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

2
有关Docker问题跟踪工具的更多信息,请访问:github.com/docker/docker/issues/5509
jannis,2016年

@larsks一个简单的字符串令人
惊讶

你救了我的一天!
Supratim Roy

18

如果要在运行时使用该值,请在中设置该ENVDockerfile。如果要在构建时使用它,则应使用ARG

范例:

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

在build命令中传递值:

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

10

假设您要在容器内启动Java进程:

Dockerfile示例摘录:

ENV JAVA_OPTS -XX +UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm 
... 
ENTRYPOINT ["/sbin/tini", "--", "entrypoint.sh"] 
CMD ["java", "${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 "$@")

0

受到以上启发,我这样做:

#snapshot by default. 1 is release.
ENV isTagAndRelease=0

CMD     echo is_tag: ${isTagAndRelease} && \
        if [ ${isTagAndRelease} -eq 1 ]; then echo "release build"; mvn -B release:clean release:prepare release:perform; fi && \
        if [ ${isTagAndRelease} -ne 1 ]; then echo "snapshot build"; mvn clean install; fi && \ 
       .....
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.