Docker之docker run参数覆盖Dockerfile中CMD命令以及CMD与ENTRYPOINT的区别

 

一:docker run参数覆盖Dockerfile中CMD命令情况

首先要明确docker run指令中的参数是什么?

答案:docker run 指令(-it/-p/-d等) 镜像名 参数(/bin/sh、bash等),即docker run命令中,镜像名后面的 都是给容器执行的命令参数

举例说明docker run参数覆盖Dockerfile中CMD命令的情况:

首先基于镜像创建一个新的镜像,Dockerfile书写如下:

按道理说:用docker run执行使用镜像创建容器时,屏幕上应该会输出:Hello World。

接下来创建镜像:

镜像创建,承建了一个名为test,版本号(tag)为1的镜像

 

然后我们分别用docker run -it test:1 和 docker run -it test:1  bash  两个指令来使用镜像创建启动容器,注意观察他们的区别

一:docker run -it test:1

这里成功输出了Hello World

二:docker run -it test:1  bash

发现并没有输出Hello World, 而是执行了 bash指令给我们提供了交互界面,因此 是docker run -it test  bash中的bash命令参数覆盖了CMD。

关于CMD和ENTRYPOINT还有一点需要特别注意的是:如果一个Dockerfile中有多个CMD或ENTRYPOINT,只有最后一个会生效,前面其他的都会被覆盖

二:CMD与ENTRYPOINT区别

区别一:ENTRYPOINT不会被docker run 中的参数命令覆盖

区别二:如果在Dockerfile中CMD与ENTRYPOINT都存在,则CMD中的指令将会被作为ENTRYPOINT中的参数,即这时候CMD里的指令会失去它的作用,只是作为一个参数(可以理解为就是字符串)了,而且这个时候docker run后的参数指令依然会覆盖CMD,但是也会失去他本身的作用,仅仅是作为参数(字符串)提供给ENTRYPOINT中的命令

例如:一个Dockerfile文件内容如下:

FROM xxx(初始镜像名)

ENTRYPOINT ["echo"]

CMD ["Hello World"]

使用该Dockerfile创建新镜像后,执行 docker run -it 镜像名,就应该会输出:Hello World(没有实际操作验证)

接下来留一个小思考,如果使用该Dockerfile创建完成新镜像之后,执行docker run -it 镜像名 bash指令创建执行容器,CMD ["Hello World"] 这一条会不会被覆盖,会不会显示Hello World?

 

依然会覆盖CMD,因此不会输出Hello World 而是会输出bash,而且 现在的bash已经不是给我们提供交互界面的指令了,而是ENTRYPOINT中 echo的一个参数了,因此也无法给我们提供交互界面

 

从 docker ps -a就可以看出,使用镜像创建运行容器时执行的指令不是bash而是“echo bash“

 

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker 是一种轻量级的容器化技术,可以将应用程序及其依赖项打包在一个可移植的容器,这种技术在现代软件开发和运行环境越来越流行。当需要在同一个容器同时运行多个服务或应用程序时,我们可以使用 DockerCMDENTRYPOINT 命令来实现。 CMD 命令用于指定容器启动时默认运行的命令,并且可以被覆盖。在 CMD 命令,我们可以指定多条命令,以分号隔开。例如: ``` CMD ["command1", "command2"] ``` 当容器启动时,会自动执行 command1 和 command2。 ENTRYPOINT 命令也类似于 CMD 命令,用于指定容器启动时要执行的命令。不同的是,ENTRYPOINT 命令可以在容器启动时不能被覆盖。如果用户在使用 docker run 命令启动容器时,指定了其他命令,这些命令会被传递给 ENTRYPOINT 命令。例如: ``` ENTRYPOINT ["command1"] CMD ["command2"] ``` 当容器启动时,会自动执行 command1,并且将命令参数传递给它。如果用户使用 docker run 命令传递了其他命令参数,那么这些参数会被传递给 CMD 命令执行。 使用这些命令可以很好地控制 Docker 容器同时运行的多个服务或应用程序。例如,我们可以指定同时运行一个 Web 服务器和一个数据库服务器的 Docker 容器,并使用 CMDENTRYPOINT 命令来启动这两个服务。要注意的是,这些服务需要在同一个容器运行,会占用更多的计算资源和内存,因此需要根据实际情况进行优化和调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值