Dockerfile的CMD与ENTRYPOINT的区别
CMD和ENTRYPOINT
我们先来试一下构建以下这个Dockerfile,并运行
FROM centos CMD ["ls","-a"]
构建
[root@zhima lizhi]# docker build -t mycentos . Sending build context to Docker daemon 17.92kB Step 1/2 : FROM centos ---> 5d0da3dc9764 Step 2/2 : CMD ["ls","-a"] ---> Running in a1e70a05d8dd Removing intermediate container a1e70a05d8dd ---> 00433fd4c299 Successfully built 00433fd4c299 Successfully tagged mycentos:latest
运行
[root@zhima lizhi]# docker run -it --name "centos1" mycentos . .dockerenv dev home lib64 media opt root sbin sys usr .. bin etc lib lost+found mnt proc run srv tmp var
可以发现,进入容器之后,就执行了ls -a命令
我们尝试一下在启动的时候加入一些参数
[root@zhima lizhi]# docker run -it --name "centos2" mycentos -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
我们发现容器并没有执行ls -al,而是直接报错了
其实这就是CMD的特性,当我在启动容器的时候添加了一个CMD后
镜像中定义的CMD就被覆盖掉了
单独的-l当然会报错了
我们来看一下使用ENTRYPOINT会怎么样
修改Dockerfile
FROM centos ENTRYPOINT ["ls","-a"]
重新构建
[root@zhima lizhi]# docker build -t mycentos . Sending build context to Docker daemon 17.92kB Step 1/2 : FROM centos ---> 5d0da3dc9764 Step 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in 22ef40dea625 Removing intermediate container 22ef40dea625 ---> 73a3d51b4d84 Successfully built 73a3d51b4d84 Successfully tagged mycentos:latest
运行容器
[root@zhima lizhi]# docker run -it --name "centos1" mycentos -l total 56 drwxr-xr-x 1 root root 4096 Jul 14 08:52 . drwxr-xr-x 1 root root 4096 Jul 14 08:52 .. -rwxr-xr-x 1 root root 0 Jul 14 08:52 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 360 Jul 14 08:52 dev drwxr-xr-x 1 root root 4096 Jul 14 08:52 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------ 2 root root 4096 Sep 15 2021 lost+found drwxr-xr-x 2 root root 4096 Nov 3 2020 media drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt drwxr-xr-x 2 root root 4096 Nov 3 2020 opt dr-xr-xr-x 191 root root 0 Jul 14 08:52 proc dr-xr-x--- 2 root root 4096 Sep 15 2021 root drwxr-xr-x 11 root root 4096 Sep 15 2021 run lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 2020 srv dr-xr-xr-x 13 root root 0 Jan 29 10:27 sys drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp drwxr-xr-x 12 root root 4096 Sep 15 2021 usr drwxr-xr-x 20 root root 4096 Sep 15 2021 var
可以发现,容器执行的是ls -al,-l指令被追加给了ENTRYPOINT定义的语句
到此这篇关于Dockerfile的CMD与ENTRYPOINT的区别的文章就介绍到这了,更多相关Dockerfile CMD与ENTRYPOINT内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
利用 trap 在 docker 容器优雅关闭前执行环境清理的方案
这篇文章主要介绍了利用 trap 在 docker 容器优雅关闭前执行环境清理的问题,需要在容器的启动脚本中,加入 trap 指令,来完成容器在退出前需要做的所有事情,本文通过脚本示例给大家介绍的非常详细,需要的朋友参考下吧2021-12-12
浅析SpringBoot打包上传到docker并实现多实例部署(IDEA版)
这篇文章主要介绍了SpringBoot打包上传到docker并实现多实例部署(IDEA版),本文通过图文并茂实例详解的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-04-04


最新评论