因为不怎么用得到,所以之前一直对Dockerfile中的CMD、ENTRYPOINT命令迷迷糊糊,没有彻底区分开这两者的区别和各自的作用,最近做练习,就根据网上的资料做测试和总结
先说一下两者的各自功能
1、CMD
用于运行程序,只是在运行容器时,即docker run时执行,目的是为启动的容器指定默认要运行的程序(默认,默认,默认,重要的事情说三遍),因为是默认,所以,即使Dockerfile中有CMD命令,但是在docker run时指定了命令或者有entrypoint,那么CMD命令就会被覆盖
2、ENTRYPOINT
也是在运行容器时执行程序,正如其名,这才是真正的程序入口,所以指定ENTRYPOINT命令会覆盖默认的CMD命令
大部分使用场景
FROM busybox
# 场景1 Dockerfile中只有CMD且只有一条命令,并且docker run不指定任何命令 output: hello world
# CMD ["echo","hello","world"]
# CMD echo "hello" "world"
# 场景2 Dockerfile中只有CMD且只有一条命令,但docker run时指定echo love you 命令,
# 此时输出结果为容器运行时指定的命令,CMD命令会被覆盖 output: love you
# docker run --name bbox01 -itd cmdt:v1 echo "love" "you"
# 场景3 Dockerfile中只有CMD命令且有多条命令,只有最后一条命令生效 output: hello world
# CMD ["echo","welcome to china"]
# CMD echo "hello","world"
# 场景4 Dockerfile中有ENTRYPOINT 和 CMD(以中括号引用的CMD命令)命令,不管哪个前哪个后,都是ENTRYPOINT命令生效,
# 并且CMD命令中参数会被当做前者的参数 ouput: welcome to china echo hello world,
# 并且此时,再在运行时指定命令,那么Dockerfile中的CMD命令会被替代,ENTRYPOINT命令不会变;
ENTRYPOINT ["echo","welcome to china"]
CMD ["echo","hello","world"]