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