dockerfile CMD执行多条命令且需要支持环境变量
发布网友
发布时间:2022-02-26 21:24
我来回答
共2个回答
热心网友
时间:2022-02-26 22:54
运行时机不太一样。
RUN是在Build时运行的,先于CMD和ENTRYPOINT。Build完成了,RUN也运行完成后,再运行CMD或者ENTRYPOINT。
ENTRYPOINT和CMD的不同点在于执行docker run时参数传递方式,CMD指定的命令可以被docker run传递的命令覆盖,例如,如果用CMD指定:
...
CMD ["echo"]
然后运行
docker run CONTAINER_NAME echo foo
那么CMD里指定的echo会被新指定的echo覆盖,所以最终相当于运行echo foo,所以最终打印出的结果就是:
foo
而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖),比如:
...
ENTRYPOINT ["echo"]
然后运行
docker run CONTAINER_NAME echo foo
则CONTAINER_NAME后面的echo foo都作为参数传递给ENTRYPOING里指定的echo命令了,所以相当于执行了
echo "echo foo"
最终打印出的结果就是:
echo foo
另外,在Dockerfile中,ENTRYPOINT指定的参数比运行docker run时指定的参数更靠前,比如:
...
ENTRYPOINT ["echo", "foo"]
执行
docker run CONTAINER_NAME bar
相当于执行了:
echo foo bar
打印出的结果就是:
foo bar
Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。
执行docker run命令时,也可以添加-entrypoint参数,会把指定的参数继续传递给ENTRYPOINT,例如:
...
ENTRYPOINT ["echo","foo"]
然后执行:
docker run CONTAINER_NAME bar #注意没有echo
那么,就相当于执行了echo foo bar,最终结果就是
foo bar
热心网友
时间:2022-02-27 00:12
怎么看着不像微软系统上的CMD命令?
您确定要微软系统的CMD命令?是的话,那么就是如下调用变量
set JAVA_OPTS=-Xms125m -Xmx256m -Dspring.profiles.active=test
java %JAVA_OPTS% -Djava.security.egd=file:/dev/./urandom -jar xxx.jar