一、RUN&CMD&ENTRYPOINT
RUN:在Build构建镜像时对镜像内部的文件或者资源进行调整,一旦这个镜像创建以后,这个镜像就是只读的了
ENTRYPOINT:容器启动时执行的命令
CMD:容器启动后执行默认的命令或参数
1、RUN-构建时运行(两种不同的书写命令格式)
①、RUN yum install -y vim #Shell 命令格式
注:Shell运行方式,使用Shell执行时,当前Shell是父进程,生成一个子shell进程;
在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell
②、RUN["yum","install","-y","vim"] #Exec命令格式
注:Exec运行方式,使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变,执行完毕,直接退出,并不会退出之前的进程环境
注:上面都是采用yum 安装我们的文本编辑器,大多数情况下,推荐使用Exec命令方式
2、ENTRYPOINT启动命令
①、ENTRYPOINT(入口点)用于在容器启动时执行命令
②、Dockerfile中只有最后一个ENTRYPOINT会被执行
③、ENTRYPOINT["ps"] #推荐使用Exec格式
注:这句话的意思相当于执行系统中ps这个命令,ENTRYPOINT是一定会被运行的
3、CMD默认命令(容器启动时执行)
①、CMD用于設置默认执行的命令
②、如Dockerfile中出现多个CMD,则只有最后一个被执行
③、如容器启动时附加指令,则CMD被忽略
④、CMD["ps","-ef"] #推荐使用Exec格式命令
注:这句话的意思相当于执行系统中ps -ef 两个命令,CMD命令不一定会执行,如果在容器启动的镜像后面添加命令的话,它会替代Dockerfile中的CMD命令,例如:docker run xbcai.com/docker_run ls 我们在镜像后面添加了ls命令,它会取代Dockerfile中的CMD
4、RUN与CMD例子演示
①、创建文件夹 mkdir docker_run
②、进入文件夹内部 cd docker_run
③、创建Dockerfile文件编写Dockerfile vim Dockerfile
④、Dockerfile文件内容如下
FROM centos
RUN ["echo","image building!!!"]#构建镜像时才会执行的
CMD ["echo","container starting..."] #CMD时容器启动时才执行
⑤、基于Dockerfile文件构建镜像,这里是在当前目录下面进行构建
docker build -t xbcai.com/docker_run . #这里会执行Dockerfile文件中的RUN命令,它是镜像构建时执行
⑥、启动容器 docker run xbcai.com/docker_run #这里会执行Dockerfile文件中的CMD命令,它时容器启动时会执行
⑦、启动容器,在镜像后面执行系统命令ls,docker run xbcai.com/docker_run ls #
如果在镜像后添加命令的话,这个命令会取代CMD执行,所以镜像文件中的CMD就不会执行了
5、演示ENTRYPOINT命令
如果单独使用ENTRYPOINT命令的话,它和CMD的效果几乎是完全一样的,我们这里演示一下,基于第4点我们直接将CMD改为ENTRYPOINT,Dockerfile如下所示
FROM centosRUN ["echo","image building!!!"] #构建镜像时才会执行的ENTRYPOINT ["echo","container starting..."] #CMD时容器启动时才执行
单独使用的话,并没有什么太大的用处,所以一般是ENTRYPOINT与CMD结合使用
6、演示ENTRYPOINT&CMD结合使用
①、构建镜像Dockerfile文件,如下所示
FROM centos
RUN ["echo","image building!!!"]#构建镜像时才会执行的
ENTRYPOINT ["ps"] #ENTRYPOINT时容器启动时才执行
CMD ["-ef"] # CMD是容器启动时才会执行
注:这里的ENTRYPOINT 、CMD在容器启动时,是会将里面的ps -ef 命令拼接一起执行的
②、构建镜像docker build -t xbcai.com/docker_run .
两个命令结合使用,用处是非常大的,因为我们都知道CMD代表默认指令,可以用外界传参替换掉默认指令,例如在容器启动的时候传递其他指令替代的,例如:docker run xbcai.com/docker_run aux,这里的意思是将aux命令替换掉原本CMD["-ef"] 里面的-ef命令