linux怎么查看本机内存大小
306
2022-10-19
Dockerfile命令RUN、CMD、ENTRYPOINT的区别
RUN
RUN命令是构建镜像时执行的命令,属于创建Docker镜像(image)的步骤。一个Dockerfile中可以有许多个RUN命令。
例如:
RUN yum install -y telnetRUN touch web.xml
CMD
CMD命令是构建容器后调用,也就是在容器启动时才进行调用。一个Dockerfile仅仅最后一个CMD起作用。
格式: CMD ["executable","param1","param2"] (运行一个可执行的文件并提供参数) CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数,即为ENTRYPOINT指定参数) CMD command param1 param2 (执行shell内部命令)示例: CMD echo "This is a test." | wc - CMD ["/usr/bin/wc","--help"]注: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
如你指定:
CMD ["/bin/echo", "this is a echo test"]
build后运行(假设镜像名为ec):
docker run ec
就会输出: this is a echo test
是不是感觉很像开机启动项,你可以暂时这样理解。
注意点:
但是如果在docker run后添加其他指令。那么CMD将直接被替换。
如:
docker run -it ubuntu /bin/bash
就不会输出:this is a echo test,因为CMD命令被”/bin/bash”覆盖了。
又比如下面这个Dockerfile文件:
FROM busyboxCMD echo "hello world"
CMD指明了Docker镜像在运行时的输出一个"hello world"
[root@bochs Docker]# docker build -t test .Sending build context to Docker daemon 2.048kBStep 1/2 : FROM busybox ---> 83aa35aa1c79Step 2/2 : CMD echo "hello world" ---> Running in a1a4d74137d2Removing intermediate container a1a4d74137d2 ---> 651b45b58fe9Successfully built 651b45b58fe9Successfully tagged test:latest[root@bochs Docker]# docker run -it testhello world
但是如果在docker run后添加其他指令。那么CMD将直接被替换
[root@bochs Docker]# docker run -it test lsbin dev etc home proc root sys tmp usr var
ENTRYPOINT
ENTRYPOINT与CMD类似,区别在于ENTRYPOINT一定会被执行。如果一个Dockerfile中同时存在ENTRYPOINT和CMD,CMD中的参数会被当做额外参数传给ENTRYPOINT。
[root@bochs Docker]# cat Dockerfile FROM busyboxENTRYPOINT ["/bin/echo","hello"]CMD ["world"]
通过docker run 来运行,CMD变成了ENTRYPOINT的参数:
[root@bochs Docker]# docker run -it test2 hello world
但是如果指明docker run 的参数china,那么输出就会变为:
[root@bochs Docker]# docker run -it test2 chinahello china
原本CMD中带的参数world被docker run中的china所替换,但ENTRYPOINT自带的hello依然正常输出
Shell与Exec格式
CMD,RUN,ENTRYPOINT可以用两种格式来传递命令和参数,Shell一般表示为指令+命令,如:
RUN yum install -y telnetCMD echo "hello world"
第一个大写的单词是Dockerfile的指令。后面跟的就是命令,可以拿到shell中单独执行
Exec格式可以表示为:指令+["命令","命令参数1","命令参数2",...],比如:
RUN ["yum","install","telnet"]ENTRYPOINT ["/bin/bash","-c","echo hello world"]
对于这两种格式来说,CMD和ENTRYPOINT最好使用Exec格式,命令和参数分开,层次性较强,而RUN则都可以。
注意:ENTRYPOINT的Shell格式和Exec格式差异很大
比如下面这个Shell格式的ENTRYPOINT
FROM busyboxENTRYPOINT echo "hello"CMD "world"
在运行所生成的容器时,仅会输出hello,而CMD带的"world"会被忽略。同样的docker run带的参数也同样会被忽略
[root@bochs Docker]# docker run -it testhello[root@bochs Docker]# docker run -it test chinahello
参考文章:
Dockerfile文件详解
Dockerfile 的 RUN 和 CMD、ENTRYPOINT
Dockerfile中RUN CMD以及ENTRYPOINT的区别
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~