Dockerfile中ENTRYPOINT 和 CMD的区别

在Docker的系统学习教程中我们了解到使用Dockerfile构建Docker镜像为一个规范的方式,根据Dockerfile可以了解镜像中安装的组件的详细内容。Dockerfile一般由四部分组成:第一,构建的基础镜像;第二,镜像构建者的信息;第三,构建镜像过程中镜像层添加指令;第四,由该镜像启动容器时执行的程序。本篇文章中涉及到的ENTRYPOINT 和CMD 属于Dockerfile中的最后一部分,这两个Dockerfile指令是用来告知Docker后台程序启动镜像时需要执行的程序,两者有细微的差别。下面将从两者的异同以及两者联合使用的高级技巧方面对两个指令进行详解。

CMD 指令

CMD 指令指定容器启动时需要运行的程序。一般用最简单的方式启动一个容器时使用docker run 会传递参数给docker指令

docker run -it image /bin/bash1

后面的/bin/bash 其实是传递参数,告知容器启动时运行一个shell。这个过程可以用CMD 指令等效的替换

CMD [‘/bin/bash‘]1

因此在Dockerfile中存在这个CMD指令指定的命令时,启动容器就可以不进行参数传递。

docker run -it image 1

执行效果一致。

[[email protected] test]# docker run --name test -it test_image
[[email protected] /]#12

如果dockerfile中已经指定了容器启动时运行的程序,同时在使用docker run 启动容器时使用了命令行参数,那么dockerfile 中的cmd指令将无效

docker run -it image /bin/ps1

发现启动容器后没有shell ,只是打印出了当前容器中的进程状态,cmd 指令效果被覆盖。

  PID TTY          TIME CMD
    1 ?        00:00:00 ps
[[email protected] test]#123

此时可以看到cmd 效果被覆盖。在一个dockerfile中只有最后一个cmd 指令有效,因此一个dockerfile中只写一个cmd 指令。

ENTRYPOINT 指令

ENTRYPOINT 指令效果与CMD 非常的类似,比较容易混淆两者的功能。最大的区别在于使用的方式,ENTRYPOINT 指定的命令需要与docker run 启动容器进行搭配,将docker run 指令后面跟的内容当做参数作为ENTRYPOINT指令指定的运行命令的参数,ENTRYPOINT 指定的linux命令一般是不会被覆盖的。以nginx 镜像为例说明

首先构建一个nginx镜像,并且指定容器运行时执行的程序为nginx。

FROM centos
MAINTAINER allocator
RUN yum install -y nginx
RUN echo ‘hello world‘ > /usr/share/nginx/html/index.html
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx"]123456

然后启动镜像

docker run --name test -p 5000:80 -it test_nginx -g "daemon off"1

后面两个是作为参数传递给nginx启动程序运行,此时nginx作为前台程序运行,是一个web服务器,可以根据外部绑定的端口,通过浏览器正常看到hello world

两者联合使用技巧

已经明白了两者的区别,可以利用两者的特点构建一个含有默认启动运行程序的镜像,并且支持docker run 启动时人为指定启动程序运行的参数。

举个例子。利用ENTRYPOINT 指定启动时运行启动nginx程序,并给定默认的运行参数为显示帮助信息,dockerfile 构建如下:

ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]12

当使用docker run --name test -it test_nginx 不传递任何参数时,此时启动容器会使用cmd 指令后的命令作为默认参数,打印nginx的帮助信息。此时cmd 后的内容并不是一个完整的指令,而是参数,如果其内容是一个完整的指令,那么它将覆盖ENTRYPOINT中的内容。

如果使用docker run --name test -it test_nginx -g "daemon off" 启动时,此时给定的运行参数会覆盖掉CMD 指令对应的内容,此时nginx将作为前台进程运行,作为一个web服务器使用,通过browser可以看到hello world

原文地址:https://www.cnblogs.com/wenqiangit/p/10298378.html

时间: 2024-10-09 16:02:13

Dockerfile中ENTRYPOINT 和 CMD的区别的相关文章

[转帖]Dockerfile: ENTRYPOINT和CMD的区别

Dockerfile: ENTRYPOINT和CMD的区别 https://zhuanlan.zhihu.com/p/30555962 在我们查阅Dockerfile的官方文档时, 有可能发现一些命令的功能重复(至少看起来干的事情差不多), 我已经在上文分析过ADD和COPY命令的区别(他们功能类似), 现在我们分析另外2个命令, 他们的功能也非常类似, 是CMD和ENTRYPOINT. 尽管ENTRYPOINT和CMD都是在docker image里执行一条命令, 但是他们有一些微妙的区别.

docker中entrypoint 和 CMD的执行总结

网上关于CMD和entrypoint的相关介绍很多,在实际工程中也确实需要了解,经过总结,有如下重点 如果 docker run 指定了其他命令,CMD 指定的默认命令将被忽略. 如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效. 在Dockerfile中,只能有一个ENTRYPOINT指令,如果有多个ENTRYPOINT指令则以最后一个为准. 如果镜像中设定了ENTRYPOINT,那么命令中的CMD也可以作为参数追加到ENTRYPOINT中. entrypoint

Dockerfile中CMD命令和ENTRYPOINT 命令的说明

首先说明下RUN.CMD.ENTRYPOINT 等命令都可以用来执行命令,但是各有不同的特点 RUN 在Build Image的时候执行. CMD ENTRYPOINT 在运行Image时执行. CMD 可以和ENTRYPOINT 搭配使用,也可以单个命令使用.当CMD 和ENTRYPOINT都出现在一个DockerFile中时,CMD中设置的信息(EXEC格式的)都以参数的形式提供给ENTRYPOINT命令.EntryPoint 命令没有设置时,默认是/bin/bash ENTRYPOINT的

Dockerfile 中的 CMD 与 ENTRYPOINT

原文:Dockerfile 中的 CMD 与 ENTRYPOINT CMD 和 ENTRYPOINT 指令都是用来指定容器启动时运行的命令.单从功能上来看,这两个命令几乎是重复的.单独使用其中的一个就可以实现绝大多数的用例.但是既然 doker 同时提供了它们,为了在使用中不至于混淆,本文试图把它们的用法理清楚. exec 模式和 shell 模式 CMD 和 ENTRYPOINT 指令都支持 exec 模式和 shell 模式的写法,所以要理解 CMD 和 ENTRYPOINT 指令的用法,就

Dockerfile中最常用的指令

FROM 指定 base 镜像. MAINTAINER 设置镜像的作者,可以是任意字符串. COPY 将文件从 build context 复制到镜像. COPY 支持两种形式: COPY src dest COPY ["src", "dest"] 注意:src 只能指定 build context 中的文件或目录. ADD 与 COPY 类似,从 build context 复制文件到镜像.不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等

Ado.net中DataSet和SqlDataReader的区别

概述: 一,SqlDataReader //基于连接,只读访问 适合数据量较小. SqlDataAdapter //基于非连接,适于数据量较大时,可以另行修改,最后再把修改结果返回给数据库.要求资源也大一点 二,SqlDataAdapter 读取数据后将数据集放入DataSet ,DataSet 的数据存在本地客服机内存. 三,SqlDataReader返回的是一个数据读写器,只能一条条的读,操作起来不灵活,一般在只读的时候才用到. SqlDataAdapter返回的是数据集或者表,可以对其中的

linux free命令中buffer与cache的区别

linux free命令中buffer与cache的区别 ~$ free total             used           free     shared   buffers     cached Mem:       1025204     981636      43568          0      38244     387808 -/+ buffers/cache:       555584      469620 Swap:      1931256    162

Dockerfile中的COPY和ADD指令详解与比较

Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的. COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源.COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中.而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中. 满足同等功能的情况下,推荐使用COPY指令.ADD指令更擅长读取本地tar文件并解压缩. 1. COPY指令 COPY指令能够将构建命令所在的主机本地的文件或目

Dockerfile的 RUN和CMD

在创建Dockerfile的时候,RUN和CMD都是很重要的命令.它们各自的作用分别如下: RUNRUN命令是创建Docker镜像(image)的步骤,RUN命令对Docker容器( container)造成的改变是会被反映到创建的Docker镜像上的.一个Dockerfile中可以有许多个RUN命令. CMDCMD命令是当Docker镜像被启动后Docker容器将会默认执行的命令.一个Dockerfile中只能有一个CMD命令.通过执行docker run $image $other_comm