docker中的run/cmd/entrypoint的区别详解

 更新时间:2021年08月03日 10:02:19   作者:morris131  
Dockerfile中run、cmd和entrypoint都能够用于执行命令,针对每个命令给他介绍详细用途,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

Dockerfile中run、cmd和entrypoint都能够用于执行命令,下面是三者的主要用途:

  • run命令执行命令并创建新的镜像层,通常用于安装软件包
  • cmd命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
  • entrypoint配置容器启动时的执行命令,不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令。

Shell格式和Exec格式运行命令

我们可以用下面两种格式指定run、cmd和entrypoint要运行的命令:

  • Shell格式: 。例如:yum install -y wget
  • Exec格式: [“executable”, “param1”, “param2”, …]。例如: [“yum”, “install”, “-y”, “wget”]

cmd和entrypoint推荐使用exec格式,因为指令的可读性更强,更容易理解,而run则两种格式都可以。

Exec格式的坑

dockerfile的内容如下:

env name morris

entrypoint ["echo", "$name"]

这种写法只会打印出$name,不会进行变量的替换,原因是它只是在执行echo命令,并不是执行shell。意思是说,我们不是在shell里执行echo,只是单纯的执行echo,所以不会替换变量。

想要改成可执行的shell,需要改写成以下形式

env name morris

entrypoint ["/bin/bash", "-c", "echo $name"]

run命令

run指令通常用于安装应用和软件包。run在当前镜像的顶部执行命令,并通过创建新的镜像层。Dockerfile中常常包含多个run指令。下面是一个例子:

run yum update && yum install -y \  
 bzr \
 cvs \
 git \
 mercurial \
 subversion

yum update和yum install被放在一个run指令中执行,这样能够保证每次安装的是最新的包。如果yum install在单独的run中执行,则会使用yum update创建的镜像层,而这一层可能是很久以前缓存的。

cmd命令

cmd指令允许用户指定容器的默认执行的命令。此命令会在容器启动且docker run没有指定其他命令时运行。下面是一个例子:

cmd echo "Hello world"

运行容器docker run -it [image]将输出:

Hello world

但当后面加上一个命令,比如docker run -it [image] echo hi,cmd会被忽略掉,命令echo hi将被执行:

hi

如果存在多个cmd命令,则只会执行最后一个cmd命令。

entrypoint命令

entrypoint的exec格式用于设置容器启动时要执行的命令及其参数,同时可通过cmd命令或者命令行参数提供额外的参数。entrypoint中的参数始终会被使用,这是与cmd命令不同的一点。下面是一个例子:

entrypoint ["echo", "Hello"]

当容器通过docker run -it [image]启动时,输出为:

Hello

而如果通过docker run -it [image] morris启动,则输出为:

Hello morris

再来看一个例子,Dockerfile为:

entrypoint ["echo", "Hello"]
cmd ["world"]

当容器通过docker run -it [image]启动时,输出为:

Hello world

而如果通过docker run -it [image] morris启动时,输出为:

Hello morris

entrypoint中的参数始终会被使用,而cmd的额外参数可以在容器启动时动态替换掉。

同样的,如果存在多个entrypoint命令,则只会执行最后一个entrypoint命令。

总结

  • 使用run指令安装应用和软件包,构建镜像。
  • 如果Docker镜像的用途是运行应用程序或服务,比如运行一个MySQL,应该优先使用Exec格式的entrypoint指令。cmd可为entrypoint提供额外的默认参数,同时可利用docker run命令行替换默认参数。
  • 如果想为容器设置默认的启动命令,可使用cmd指令。用户可在docker run命令行中替换此默认命令。

到此这篇关于docker中的run/cmd/entrypoint的区别详解的文章就介绍到这了,更多相关docker run/cmd/entrypoint内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker镜像完全卸载的操作步骤

    docker镜像完全卸载的操作步骤

    这篇文章主要介绍了docker镜像完全卸载的操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • docker下载镜像太慢的解决方案

    docker下载镜像太慢的解决方案

    这篇文章主要介绍了docker下载镜像太慢的解决方案,具体操作步骤很详细也很简单,有遇到相同问题但是不知道如何解决的同学可以尝试下
    2021-03-03
  • docker 已经运行的容器重命名

    docker 已经运行的容器重命名

    有时我们将容器名字起的不太好,想改一下,本文主要介绍了docker 已经运行的容器重命名,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • docker建立私有仓库的过程

    docker建立私有仓库的过程

    这篇文章主要介绍了docker私有仓库的建立,在这需要注意从私有仓库下载先移出原镜像,具体操作过程跟随小编一起看看吧
    2022-01-01
  • Docker Machine创建Azure虚拟主机

    Docker Machine创建Azure虚拟主机

    这篇文章主要为大家详细介绍了Docker Machine创建Azure虚拟主机的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 如何通过vs2017的Dockerfile来生成镜像

    如何通过vs2017的Dockerfile来生成镜像

    这篇文章主要为大家详细介绍了如何通过vs2017的Dockerfile来生成镜像,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Docker以挂载方式安装RocketMQ的实现方式

    Docker以挂载方式安装RocketMQ的实现方式

    Docker中安装和使用RocketMQ有多种方式,本文主要介绍了Docker以挂载方式安装RocketMQ的实现方式,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • 清理docker占用磁盘过大问题终极方案(亲测有效!)

    清理docker占用磁盘过大问题终极方案(亲测有效!)

    Docker很占用空间每当我们运行容器、拉取镜像、部署应用、构建自己的镜像时我们的磁盘空间会被大量占用,这篇文章主要给大家介绍了关于清理docker占用磁盘过大问题终极方案,需要的朋友可以参考下
    2024-04-04
  • docker在Linux环境下的安装教程

    docker在Linux环境下的安装教程

    这篇文章主要介绍了docker在Linux环境下的安装教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • docker容器配置启动参数

    docker容器配置启动参数

    通过添加参数,我们可以在启动 Docker 容器时灵活地配置容器的行为,本文介绍了通过命令行和 Dockerfile 两种方式添加参数的方法,并给出了常用参数的示例,希望本文能帮助您理解如何在 Docker 启动时添加参数,并正确地配置和管理 Docker容器
    2023-10-10

最新评论