如何在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 "$@")