首页 > 其他分享 >RUN、CMD、ENTRYPOINT区别

RUN、CMD、ENTRYPOINT区别

时间:2024-03-03 23:44:05浏览次数:27  
标签:RUN Exec CMD ENTRYPOINT 格式 Hello

1、简要概述

  • RUN: 执行命令并创建新的镜像层,RUN 经常用于安装软件包。
  • CMD: 设置容器启动后默认执行的命令及其参数,但CD能够被docker run后面跟的命令行参数替换。
  • ENTRYPOINT: 配置容器启动时运行的命令。

2. Shell 和 Exec 格式

  • 两种方式指定RUN、CMD和ENTRYPOINT要运行的命令:Shell格式和Exec格式,二者在使用上有细微的区别。
  1. Shell 格式:
<instruction> <command>

例如:

RUN apt-get install python3
CMD echo "Hello world"
ENTRYPOINT echo "Hello world"

当指令执行时,shell 格式底层会调用 /bin/sh -c [command]。会解析 <command> 中带有的变量。

例如:

ENV name Cloud Man
ENTRYPOINT echo "Hello, $name"

输出:

Hello, Cloud Man
  1. Exec 格式。
<instruction> ["executable", "paraml", "param2", ...]

例如:

RUN [ "apt-get", "install","python3"]
CMD ["/bin/echo", "Hello world"]
ENTRYPOINT ["/bin/echo","Hello world"]

当指令执行时,会直接调用 [command],不会被 shell 解析。

例如:

ENV name Cloud Man
ENTRYPOINT「"/bin/echo","Hello, $name"]

输出:

Hello,$name

如果希望使用环境变量:

ENV name Cloud Man
ENTRYPOINT ["/bin/sh", "-c", "echo hello, $name"]

输出:

Hello,Cloud Man

3. RUN

  • RUN 指令通常用于安装应用和软件包。
  • RUN 在当前镜像的顶部执行命令,并创建新的镜像层。Dockerfle中常常包含多个RUN指令。
  • RUN 有两种格式:
    • Shell 格式: RUN
    • Exec 格式: RUN ["executable","paraml","param2"]
      例子
RUN apt-get update && apt-get install -y vim

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

4. CMD

CMD 指令允许用户指定容器的默认执行的命令。此命令会在容器启动且 docker run 没有指定其他命令时运行。

  • 如果 docker run 指定了其他命令,CMD 指定的默认命令将被忽略
  • 如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效。

CMD 有三种格式:

  • Exec 格式: CMD ["executable","paraml","param2"] 这是 CMD 的推荐格式。
  • CMD ["paraml","param2"] 为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式。
  • Shell 格式: CMD command paraml param2

第二种格式 CMD ["paraml","param2"] 要与 Exec 格式的 ENTRYPOINT 指令配合使用,其用途是为 ENTRYPOINT 设置默认的参数。

CMD echo "Hello world"

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

Hello world

后面加上一个命令,比如 docker run -it [image] /bin/bash ,CMD 会被忽略掉,命令 bash 将被执行:

root@10a32dc7d3d3:/#

5. ENTRYPOINT

  • ENTRYPOINT 指令可让容器以应用程序或者服务的形式运行。
  • ENTRYPOINT 看上去与 CMD 很像,它们都可以指定要执行的命令及其参数。不同的地方在于 ENTRYPOINT 不会被忽略,一定会被执行,即使运行docker run 时指定了其他命令。

ENTRYPOINT 有两种格式:

  • Exec 格式: ENTRYPOINT ["executable","param1","param2"] 这是 ENTRYPOINT 的推荐格式。
  • Shell 格式: ENTRYPOINT command paraml param2.
  1. Exec 格式:
  • ENTRYPOINT 的 Exec 格式用于设置要执行的命令及其参数,同时可通过 CMD 提供额外的参数。
  • ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。
    例如
ENTRYPOINT [ "/bin/echo","Hello" ]
CMD [ "world" ]

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

Hello world

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

Hello CloudMan
  1. Shell 格式
  • ENTRYPOINT 的 Shell 格式会忽略任何 CMD 或 docker run 提供的参数。

标签:RUN,Exec,CMD,ENTRYPOINT,格式,Hello
From: https://www.cnblogs.com/ccblblog/p/18051001

相关文章

  • 云原生基础设施代码化-terragrunt处理
    Terragrunt是什么?Terragrunt是一个基于Terraform的开源工具,它通过向Terraform添加一些额外的功能来帮助管理和组织Terraform代码。它提供了许多功能,包括:DRY(Don’tRepeatYourself):使用Terragrunt可以减少Terraform代码冗余。例如,您可以将共享的配置块抽象为公共模块,然后在需......
  • pytorch报错:Variable._execution_engine.run_backward( # Calls into the C++ engine
    GPU模式下运行pytorch代码报错,pytorch为2.2.1,NVIDIA驱动版本535.161.07File"/home/devil/anaconda3/envs/sample-factory/lib/python3.11/site-packages/torch/_tensor.py",line522,inbackwardtorch.autograd.backward(File"/home/devil/anaconda3/envs/sample-......
  • docker Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is th
    应该是docker异常关闭导致无法启动。步骤1参考《https://www.cnblogs.com/langgeligelang/p/14607658.html》执行systemctldaemon-reloadsystemctlrestartdocker如果失败,提示Authorizationnotavailable.Checkifpolkitserviceisrunningorseedebugmessagef......
  • Windows下CMD和Tomcat设置编码为UTF-8
    由于日常编写代码,都是使用UTF-8编码,而CMD默认是GBK编码,导致执行mvn命令时,出现中文乱码问题,而chcp命令只在当次打开有效,每次打开都要重新切换代码页十分不便。对于CMD,可以通过修改注册表的方式,永久修改默认代码页。打开注册表编辑器,定位到\HKEY_CURRENT_USER\Console\%SystemRoot%......
  • 深入浅出Gitlab Runner自动构建C#应用程序
    概述程序员签入代码到Gitlab之后,GitlabRunner自动从流水线领取作业。按我们编排的“作业”,流水线工作步骤如下:程序员在Windows的VisualStudio2022中签入了“解决方案A”到Gitlab;Gitlab根据我们编排的.gitlab-ci.yml创建“流水线”;GitlabRunner领取到“作业”,以指定映像......
  • Gitlab Runner自动执行Docker容器
    概述Gitlab完全可以执行dockerrun命令,本文用最简单的方式来演示。修改.gitlab-ci.yml加入第4个stage,运行dockerrun。stages:-build-docker-image-test-push-image-run-websitevariables:PAY_IMAGE_FULL_URL:docker.amihome.cn/amihome/chang......
  • Gitlab Runner自动推送Docker映像
    接上文,增加两个stage最简单的推送,其实是在dockerbuild后边带上--push的开关即可。但是不经过测试就上传,Docker仓库里很快会堆满垃圾。所以我们设计新增两个场景,经过测试之后才push映像去仓库。stages:-build-docker-image-test-push-imagevariables:......
  • Gitlab Runner自动制作C#网站项目的Docker映像
    概述代码签入Gitlab后,GitlabRunner自动执行dockerbuild,构建网站应用的Docker映像。在VisualStudio2022中创建解决方案在Gitlab中创建项目这一步省略。签入源代码到Gitlab为项目添加Dockerfile在解决方案根目录下创建“.gitlab-ci.yml”stages:-build-docke......
  • GitLab Runner 添加 极狐GitLab 域名 host
    本文作者徐晓伟自定义GitLab域名解析查看极狐GitLabrunner日志查看极狐GitLabRunnerPod名称[root@anolis-7-9~]#kubectl-ngitlab-testgetpod|grepgitlab-runnermy-gitlab-gitlab-runner-6fb4bf7468-nmnkp0/1Running29(62sago)......
  • springboot应用中根据特定条件使用CommandLineRunner
    PS使用SpringBoot3.1.2进行测试1.使用@ConditionalOnProperty仅当特定属性存在或具有特定值时,注释@ConditionalOnProperty才会创建bean。在此示例中,仅当或文件中的CommandLineRunner属性db.init.enabled设置为true时才会执行application.propertiesapplication.ymlpac......