如何在Dockerfile CMD中使用变量?

时间:2016-11-06 20:59:24

标签: docker dockerfile

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

4 个答案:

答案 0 :(得分:82)

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

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

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

  • 无变量扩展
  • 没有通配符扩展
  • 使用><|等进行i / o重定向
  • command1; command2
  • 没有多项命令
  • 等等。

如果您希望CMD扩展变量,则需要安排shell。你可以这样做:

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

或者您可以使用简单的字符串而不是执行列表,这会使您获得与前一示例大致相同的结果:

CMD django-admin startproject $PROJECTNAME

答案 1 :(得分:6)

假设你想在容器中启动一个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 "$@")

答案 2 :(得分:3)

如果要在运行时中使用该值,请在Dockerfile中设置ENV值, 如果要在构建时使用它,则可以直接使用ARG

示例:

ARG值 ENV envValue = $值 CMD [“ sh”,“ -c”,“ java -jar $ {envValue} .jar”]

在构建命令中传递值 docker build -t tagName --build-arg value =“ jarName”

答案 3 :(得分: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 && \ 
       .....