1.RUN
在build构建时执行命令。
举例:安装vim
Shell命令格式
RUN yum install -y vim
Exec命令格式
RUN ["yum","install","-y","vim"]
2.CMD
用于设置容器启动时默认执行的命令或参数。
如果Dockerfile中有多个CMD,只有最后一个CMD会被执行。
如果容器启动时附加执行,则CMD被忽略。
推荐使用Exec格式执行命令,例如:CMD ["ps","-ef"]
3.ENTRYPOINT
ENTRYPOINT(入口点)用于在容器启动时执行命令。
Dockerfile中只有最后一个ENTRYPOINT会被执行。
推荐使用Exec格式执行命令,例如:ENTRYPOINT ["ps"]
三个执行命令的区别示意图:
使用案例
下面用用例子来说明命令的用法,新建Dockerfile文件,文件中内容为:
FROM centos
RUN echo "image building!!"
CMD ["echo","container starting...."]
将Dockerfile文件放入到/usr/local目录中,然后命令窗口切换到/usr/local路径下,执行创建镜像的命令:
docker build -t shell .
创建名为shell的镜像
从执行结果可以看出,CMD命令对应的container starting....没有被输出。
运行镜像,创建容器:
docker run shell
此时CMD命令被执行。
接着把Dockerfile文件中的内容进行修改,写两个CMD命令
FROM centos
RUN echo "image building!!"
CMD ["echo","container starting...."]
CMD ["echo","容器正在启动...."]
重新构建镜像
docker build -t shell .
运行镜像,生成容器
docker run shell
输出的CMD命令,只有最后一个。
CMD可以被命令行的内容覆盖,也就是说命令行的优先级更高。
下面看看ENTRYPOINT的用法,把Dockerfile文件中的CMD改为ENTRYPOINT。
FROM centos
RUN echo "image building!!"
ENTRYPOINT ["echo","我是ENTRYPOINT输出信息1"]
ENTRYPOINT ["echo","我是ENTRYPOINT输出信息2"]
重新构建镜像
docker build -t shell .
运行镜像,生成容器
docker run shell
从上面信息可以看到,ENTRYPOINT同CMD一样,多个ENTRYPOINT时,只有最后一个命令会被执行,前面的不会执行。
这么看好像ENTRYPOINT同CMD一样,没有区别,两个都是在容器创建时被执行,且都是只有最后一个被执行。
这只是它们的相同点,它们的应用场景其实不同。ENTRYPOINT用来编写固定的命令,CMD用来写默认命令。比如现在要执行 ps -ef命令,查看所有进程的详细信息。
Dockerfile文件中的内容进行如下:
FROM centos
RUN echo "image building!!"
ENTRYPOINT ["ps"]
CMD ["-ef"]
重新构建镜像
docker build -t shell .
运行镜像,生成容器
docker run shell
可以看到 ps -ef命令被执行,也就是说CMD的特点是用来作为默认值。
CMD还允许被动态修改,比如把 -ef 改为 -aux
也就是说在运行命令时,如果不添加参数,那就用CMD的值,如果添加了参数,那么CMD的值将被动态修改为新的值。
在大多数情况下,ENTRYPOINT后面跟的是固定命令,CMD后面写的是可以灵活变化的参数。