docker的run,cmd,entrypoint分析和对比

这篇具有很好参考价值的文章主要介绍了docker的run,cmd,entrypoint分析和对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

本文一起看下Dockerfile中经常用到的几个类似命令,RUN,CMD,ENTRYPOINT。

1:容器是怎么来的?

想要有容器我们就必须先创建镜像,而想要有镜像,我们则必须写一个用来描述想要创建的镜像的文件,这个文件我们一般叫做Dockerfile(非强制),则容器怎么来的就如下图:

docker的run,cmd,entrypoint分析和对比

经过上图的过程1我们就有了镜像,经过过程2我们就有了容器了,知道了这个过程,我们就可以来正式开始分析RUN,CMD,ENTRYPOINT命令了。

2:RUN

docker的run,cmd,entrypoint分析和对比

RUN命令是在上图过程1中执行的,如下的Dockerfile:

FROM busybox
WORKDIR /var
RUN pwd

则执行docker build时就会输出pwd的结果:

dongyunqi@dongyunqi-virtual-machine:~$ docker build -t test-push-dockerhub:0.1 -f howPwd.txt helloworld-app/
Sending build context to Docker daemon  8.738kB
Step 1/3 : FROM busybox
 ---> 827365c7baf1
Step 2/3 : WORKDIR /var
    /var # 这里就是pwd的输出,其实输出的就是工作目录,不过输出的到底是什么此时不重要,我们主要是验证pwd在docker build时执行了
Step 3/3 : RUN pwd
 ---> Using cache
 ---> 7975c01019bd
Successfully built 7975c01019bd

3:CMD

在容器启动时执行的命令,一般用来启动应用等,如下Dockerfile:

dongyunqi@dongyunqi-virtual-machine:~/test$ cat testEntrypoint.txt 
FROM busybox
CMD echo "hello world"

构建:

dongyunqi@dongyunqi-virtual-machine:~/test$ docker build -t test-entrypoint:v0.1 -f testEntrypoint.txt .
...

运行容器:

dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test-entrypoint:v0.1
hello world

可以看到正常输出了。另外如果是有多个CMD只会保留最后一个,如下:

FROM busybox
CMD echo "hello world"
CMD echo "hello world1111"

测试:

dongyunqi@dongyunqi-virtual-machine:~/test$ docker build -t test_entrypoint:v0.1 -f testEntrypoint.txt .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> 827365c7baf1
Step 2/3 : CMD echo "hello world"
 ---> Using cache
 ---> c596d2e7bfb5
Step 3/3 : CMD echo "hello world1111"
 ---> Running in 9369670af208
Removing intermediate container 9369670af208
 ---> d7d08688d050
Successfully built d7d08688d050
Successfully tagged test_entrypoint:v0.1
dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test_entrypoint:v0.1
hello world1111
dongyunqi@dongyunqi-virtual-machine:~/test$

可以看到只输出了hello world1111。以上的是shell格式,我们也可以用Exec 格式,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ cat testEntrypoint.txt 
FROM busybox
CMD ["/bin/echo", "Hello world222"]  

测试:

dongyunqi@dongyunqi-virtual-machine:~/test$ docker build -t test_entrypoint:v0.1 -f testEntrypoint.txt .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM busybox
 ---> 827365c7baf1
Step 2/2 : CMD ["/bin/echo", "Hello world222"]
 ---> Running in d69c8fdbb1a4
Removing intermediate container d69c8fdbb1a4
 ---> 5e0920f3e988
Successfully built 5e0920f3e988
Successfully tagged test_entrypoint:v0.1
dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test_entrypoint:v0.1
Hello world222

可以看到正常输出了Hello world222。但是如果是在docker run时指定了启动命令,则会覆盖CMD,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test_entrypoint:v0.1 /bin/echo "hey man!"
hey man!

4:ENTRYPOINT

ENTRYPOINT在Dockerfile中的表现和CMD是一样的,但是ENTRYPOINT不会被docker run中指定的命令覆盖,但是也分为两种情况,如果是使用shell格式的话则docker run中指定的命令将会被忽略,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ cat testEntrypoint.txt 
FROM busybox
ENTRYPOINT echo "Hello world44444"  
dongyunqi@dongyunqi-virtual-machine:~/test$ docker build -t test_entrypoint:v0.1 -f testEntrypoint.txt .
Sending build context to Docker daemon  2.048kB
...
dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test_entrypoint:v0.1 11111111111/bin/echo "hey man!"
Hello world44444

如果是Exec格式的话则会被当做参数追加到后面,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ cat testEntrypoint.txt 
FROM busybox
ENTRYPOINT ["echo", "Hello world555"]  
dongyunqi@dongyunqi-virtual-machine:~/test$ docker build -t test_entrypoint:v0.1 -f testEntrypoint.txt .
Sending build context to Docker daemon  2.048kB
...
dongyunqi@dongyunqi-virtual-machine:~/test$ docker run --rm test_entrypoint:v0.1 11111111111/bin/echo "hey man!"
Hello world555 11111111111/bin/echo hey man!

相当于是在Dockerfile中写的是ENTRYPOINT ["echo", "Hello world555", "11111111111/bin/echo", "hey man!"]

4:比较

RUN:在docker build生成镜像时执行。
CMD:在docker run时执行,但其会被docker run中指定的命令覆盖
ENTRYPOINT:在docker run时执行,但不会被docker run中指定的命令覆盖,如果是ENTRYPOINT使用shell格式则会忽略,使用Exec格式则会作为参数追加后执行

所以RUN比较独立,CMD和ENTRYPOINT几乎一样,只是在docker run指定指定命令时的表现不同。

写在后面

参考文章列表:

docker精简入门(五)run&cmd&enterpoint区别 。文章来源地址https://www.toymoban.com/news/detail-427645.html

到了这里,关于docker的run,cmd,entrypoint分析和对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Dockerfile里的ENTRYPOINT和CMD

    RHEL 9.3 Docker Community 24.0.7 如果懒得看详细介绍,可以直接看总结: ENTRYPOINT 和 CMD 都可以单独使用,指定启动容器时所运行的命令以及参数。 更常见的用法是把 ENTRYPOINT 和 CMD 组合使用: ENTRYPOINT 指定启动容器时所运行的命令和不变的参数。在启动容器时可以显式覆盖,但一

    2024年01月24日
    浏览(25)
  • Dockerfile: CMD与ENTRYPOINT区别

    CMD和ENTRYPOINT这两个命令,我接触到的是用在了Dockerfile中用于构建容器。 CMD:The main purpose of a CMD is to provide defaults for an executing container. CMD的主要用途是为正在执行的容器提供默认值。也就是指定这个容器启动的时候要运行的命令。 ENTRYPOINT:也是指定这个容器启动的时候要运

    2024年02月02日
    浏览(30)
  • 48-Dockerfile-CMD/ENTRYPOINT指令

    前言 本篇来学习下Dockerfile中的CMD/ENTRYPOINT指令 CMD 作用 启动容器时默认执行的命令 说明: 一个 Dockerfile 只有一个 CMD 指令,只有最后一个 CMD 指令生效 使用 docker run -d xxx CMD 命令是可以覆盖 Dockerfile 中的 CMD 指令的 格式 使用示例 新建dockerfile 制作镜像 运行容器 可以看到只执

    2024年02月04日
    浏览(54)
  • dockerfile用ENTRYPOINT好还是用CMD好

    在 Dockerfile 中使用 `ENTRYPOINT` 和 `CMD` 都有其用途和优劣势,具体取决于你的应用和需求。这两个指令的主要区别在于如何处理容器启动时的命令参数。 1. `CMD` 指令:    - `CMD` 用于定义容器启动时的默认命令,但它可以在运行容器时被替代。如果在运行容器时提供了命令参数

    2024年02月08日
    浏览(36)
  • docker ENTRYPOINT 执行多条命令

    如何在docker里面同时启动多个pm2进程_祥仔先生的博客-CSDN博客_docker pm2 ENTRYPOINT 命令1 命令2 命令3 dockerfile中添加: RUN chmod -x setup.sh ENTRYPOINT [\\\"sh\\\", \\\"./setup.sh\\\"]

    2024年02月12日
    浏览(28)
  • 【云计算 | Docker】Docker容器后台运行不了?entrypoint在作妖?

    使用镜像 alpine 起个容器,使其保持后台运行,正常情况有如下的效果,可以发现容器保持运行状态。 但是有时候一些容器镜像按照上述方法却达不到预期效果。比如下面这个容器,一创建完就退出了。 那么问题出在哪个环节呢? 首先明确一个Docker容器的特性, docker容器运

    2024年02月14日
    浏览(29)
  • Docker 制作 MySQL 镜像并使用 `/docker-entrypoint-initdb.d/` 机制初始化数据

    制作一个 MySQL Docker 镜像并初始化数据库信息 win 11 Docker-Desktop 4.14.0 (91374) 启动一个MySQL容器很容易。如何初始化数据呢? 大概我们会尝试很多操作,比如百度常见到 使用 CMD 命令调用shell脚本,通过shell脚本处理初始化数据等等,经过实践,这些都不太方便。 其实,MySQL 官方提

    2024年01月18日
    浏览(36)
  • 【Docker】什么是Docker呢?本文带你洞悉

    🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前专攻C/C++、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:C++STL、蓝桥杯,喜欢OJ的小伙伴可以看一手 🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​ ⛱️学习应使你快乐!望与诸君

    2024年02月12日
    浏览(64)
  • 使用docker-compose启动docker镜像报错exec ./docker-entrypoint.sh: no such file or directory

    报错原因:exec ./docker-entrypoint.sh: no such file or directory 我们可以在linux下通过cat -v命令查看.sh文件   例: cat -v Dockerfile         WORKDIR /tools/*******/^M         RUN chmod a+x /tools/*********/docker-entrypoint.sh^M         ENTRYPOINT [\\\"./docker-********.sh\\\"]^M 这种后缀有^M的即为编码错误造成的

    2024年02月15日
    浏览(30)
  • docker容器日志报错:/docker-entrypoint.sh: exec: line 10: /bin/bash: not found(去掉/bin/bash)

    这个错误提示表明eclipse-mosquitto镜像生成的容器内部找不到 /bin/bash 这个命令,可能是由于在容器镜像中没有安装 Bash 或在执行脚本时路径不正确导致的。如果你使用的是官方的 eclipse-mosquitto 镜像,那么这个问题一般不会出现。 如果你在 Dockerfile 中指定了自己的 ENTRYPOINT 或

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包