首页 > 其他分享 >Dockerfile中的CMD指令和ENTRYPOINT指令

Dockerfile中的CMD指令和ENTRYPOINT指令

时间:2023-03-19 11:35:48浏览次数:45  
标签:CMD 指令 ENTRYPOINT ls ubuntu 参数 docker

1. 概述

CMD 指令

功能:
    指定一个容器启动时要运行的命令
指令格式:
    shell 格式:
        CMD "可执行文件" "参数1" "参数2" ...
    exec 格式:
        CMD ["可执行文件", "参数1", "参数2" ...]
详细说明:
    1. Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,前面的 CMD 都不会被执行
    2. CMD 会被 docker run 之后的参数替换。(覆盖)
额外提示:
    CMD ["参数1", "参数2" ...],在指定了 ENTRYPOINT 指令后,将会使用 CMD 指定具体的参数

ENTRYPOINT 指令

功能:
    指定一个容器启动时要运行的命令
指令格式:
    shell 格式:
        ENTRYPOINT "可执行文件" "参数1" "参数2" ...
    exec 格式:
        ENTRYPOINT ["可执行文件", "参数1", "参数2" ...]
详细说明:
    1. Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效,前面的 ENTRYPOINT 都不会被执行
    2. ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序和参数,不过 ENTRYPOINT 命令不会被 docker run 之后的参数替换,而是在 ENTRYPOINT 的基础上,在后面加上 docker run 之后的参数。(追加)

2. 实际操作的示例

提示:

  • 可通过 docker ps -a 来查看最终运行的命令
  • 可通过 docker logs -f -t 容器ID 来查看命令运行后的打印效果

(1) 多个 CMD 的情况

FROM ubuntu

CMD ["echo", "111111111111111111111111"]
CMD ["echo", "222222222222222222222222"]

运行结果:
只有第二个 CMD 指令运行

image

(2) 多个 CMD 的情况 + docker run 有参数

FROM ubuntu

CMD ["echo", "111111111111111111111111"]
CMD ["echo", "222222222222222222222222"]
docker run -d ubuntu ls -l

ls -l 将某目录以详细列表的形式进行展示

运行结果:
Dockerfile 中所有的 CMD 都没有被执行,而是运行了 docker run 之后的参数,或者说最后一个 CMD ["echo", "222222222222222222222222"] 被替换成了 CMD ["ls", "-l"]

image

(3) 多个 ENTRYPOINT 的情况

FROM ubuntu

ENTRYPOINT ["echo", "111111111111111111111111"]
ENTRYPOINT ["echo", "222222222222222222222222"]

运行结果:
只有第二个 ENTRYPOINT 指令运行

image

(4) 多个 ENTRYPOINT 的情况 + docker run 有参数

FROM ubuntu

ENTRYPOINT ["echo", "111111111111111111111111"]
ENTRYPOINT ["ls"]
docker run -d ubuntu -l

最终将会被转化为:
    ls -l

lsls -l 展示目录详细信息的差别:
image

运行结果:
ENTRYPOINT 命令不会被 docker run 之后的参数替换,而是在 ENTRYPOINT 的基础上,在后面加上 docker run 之后的参数

image

(5) 一个 CMD 和一个 ENTRYPOINT 结合使用的情况

FROM ubuntu

CMD ["-l"]
ENTRYPOINT ["ls"]

运行结果:
在指定了 ENTRYPOINT 指令后,将会使用 CMD 指定具体的参数,即 ls -l

image

额外说明:
CMD指令放在ENTRYPOINT指令前面CMD指令放在ENTRYPOINT指令后面 是一样的结果,也就是下面的 Dockerfile 和上面是一致的效果

FROM ubuntu

ENTRYPOINT ["ls"]
CMD ["-l"]

(6) 多个 CMD 和一个 ENTRYPOINT 结合使用的情况

FROM ubuntu

CMD ["-l"]
CMD ["-a"]
ENTRYPOINT ["ls"]

运行结果:
最终只有最后一个 CMD 被当做 ENTRYPOINT 指令的参数,即最终执行的命令为 ls -a

image


FROM ubuntu

CMD ["-l"]
ENTRYPOINT ["ls"]
CMD ["-a"]
FROM ubuntu

ENTRYPOINT ["ls"]
CMD ["-l"]
CMD ["-a"]

以上两种都会转换为命令:ls -a

(7) 多个 CMD 和多个 ENTRYPOINT 结合使用的情况

FROM ubuntu

CMD ["-a"]
CMD ["-l"]
ENTRYPOINT ["mkdir", "tes"]
ENTRYPOINT ["ls"]

运行结果:
只有最后一个 CMD 和 最后一个 ENTRYPOINT 起效果了,即 ls -l

image

下面的 Dockerfile 内容的实际运行效果和上面的一致

FROM ubuntu

ENTRYPOINT ["mkdir", "tes"]
ENTRYPOINT ["ls"]
CMD ["-a"]
CMD ["-l"]

(8) 多个 CMD 和多个 ENTRYPOINT + docker run 加参数的使用情况

FROM ubuntu

CMD ["-a"]
CMD ["-l"]
ENTRYPOINT ["mkdir", "tes"]
ENTRYPOINT ["ls"]
docker run -d ubuntu -f

运行结果:
CMDdocker run 后面的 -f 参数给替换了,因此和最后一个 ENTRYPOINT 形成了 ls -f

image

下面的 Dockerfile 内容的实际运行效果和上面的一致

FROM ubuntu

ENTRYPOINT ["mkdir", "tes"]
ENTRYPOINT ["ls"]
CMD ["-a"]
CMD ["-l"]
docker run -d ubuntu -f

标签:CMD,指令,ENTRYPOINT,ls,ubuntu,参数,docker
From: https://www.cnblogs.com/wanghuizhao/p/17232664.html

相关文章

  • dos常用指令
    常用的dos命令#盘符切换d:#查看当前目录下的所有文件dir#切换目录cd+目录地址cd/dd:cd..回到上一级目录#清理目录cls#退出终端exit#查看ipipcon......
  • 自定义指令
    Vue是一个流行的JavaScript框架,它允许开发人员构建动态的用户界面和单页应用程序。Vue的灵活性使其成为开发人员的首选框架之一,其中一个重要的原因是其能够自定义指令,以便......
  • Tomcat监控原理cmdline-jmxclient-0.10.3.jar源码解析
    【摘要】cmdline-jmxclient-0.10.3.jar是一个开源jar包,在zabbix3.0中常用于测试的一个工具,可以用来测试jmx是否配置正确。在监控方面后还可以对Tomcat各种属性进行监控。......
  • Vue指令:内置指令和自定义指令
    Vue指令Vue指令指的是,以v-开头的一组特殊语法内置指令v-textv-text指令的作用是:设置标签的内容默认写法会替换全部内容,差值表达式{{}}只会替换指定内容内部......
  • 通过在编译的时候插入一些指令,在运行时通过这些插入的指令检测并发读写从而发现 data
    01|Mutex:如何解决资源并发访问问题?https://time.geekbang.org/column/article/294905在编译的代码中,增加了runtime.racefuncenter、runtime.raceread、runtime.racewr......
  • Vue.js 内置指令 v-pre指令
    视频<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>v-pre指令</title> <!--引入Vue--> <scripttype="text/javascript"src="../js/vue.js......
  • Vue.js 内置指令 v-once指令
    视频<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>v-once指令</title> <!--引入Vue--> <scripttype="text/javascript"src="../js/vue.j......
  • in check_call raise CalledProcessError(retcode, cmd)——subprocess.CalledProcess
    BuildingHabitat-Sim时候的erro运行命令:./build.sh--headless--bulletincheck_callraiseCalledProcessError(retcode,cmd)subprocess.CalledProcessError:Com......
  • Linux基本指令(上)
    写在前面好久没有写博客了,学校快要期末考试了,这个是在零碎的时间的拼凑出来了的。闲言少序,在了解了Linux的历史背景后,我们需要开始初步开始学习如何使用Linux系统.操作系统......
  • Linux基本指令(中)
    写在前面今天我们首要的目的就是把我们常用的指令和大家分享完,我们添加一些管道和压缩的命令,指令这个部分到这里就基本结束了,当然,这些都是最基本的,后面我们用到其他指......