首页 > 其他分享 >dockerfile CMD 和 ENTRYPOINT 分别什么时候用

dockerfile CMD 和 ENTRYPOINT 分别什么时候用

时间:2024-06-13 20:12:31浏览次数:23  
标签:容器 CMD 命令 ENTRYPOINT 参数 docker dockerfile

 

在 Docker中,CMD 和 ENTRYPOINT 指令都是用来定义容器启动时运行的默认命令,但它们的用途和行为有所不同,适用于不同的场景:

CMD

  用途:CMD指令用来指定容器启动后默认执行的命令及其参数。它更倾向于提供默认的或可被替代的执行行为。

  可覆盖性:当使用docker run命令启动容器时,如果指定了额外的命令或参数,CMD会被这些命令或参数覆盖。这使得CMD适合定义那些可能根据容器使用情境变化的默认行为。

  使用场景:当你希望最终用户能够轻松地覆盖默认命令或添加额外参数时使用CMD,比如运行一个web服务器,默认情况下可以是服务启动命令,但用户可以通过docker run来指定自己的命令。

 

ENTRYPOINT

  用途:ENTRYPOINT 指令用于设置容器启动时要执行的命令,它更像是容器的入口点。
与CMD不同,它设计得更加固定,通常用于确保容器作为特定类型的应用程序运行。

  可覆盖性:虽然可以通过 docker run 命令附加参数,这些参数不会覆盖 ENTRYPOINT 指令,而是作为 ENTRYPOINT 指定命令的参数传入。这意味着ENTRYPOINT定义的行为更为稳定,不易被意外改变。

  使用场景:当你需要确保容器总是以特定的命令或脚本启动,并且这个行为不希望轻易被用户修改时,应使用ENTRYPOINT。


  例如,如果你的容器是为了运行一个特定的 Python 脚本或 Java 应用,那么 ENTRYPOINT 可以设置为该脚本的执行器(如python或java)。


结合使用

  通常,ENTRYPOINT 和 CMD 可以一起使用,以达到既定义了容器的主入口点,又提供了默认参数的效果。

  CMD的值可以被 docker run 的命令行参数覆盖,而这些参数会作为 ENTRYPOINT 指定命令的参数。

 

总结来说,选择 CMD 还是 ENTRYPOINT,取决于你希望容器的启动行为有多固定,以及用户是否有能力或需要改变默认的命令执行。

 

在 Dockerfile 中,结合使用 ENTRYPOINT 和 CMD 的一个典型示例是配置一个运行特定应用程序的容器。

下面是一个简单的示例,假设我们正在构建一个运行MySQL数据库的Docker镜像:

FROM mysql:latest

ENV MYSQL_ROOT_PASSWORD=my-secret-pw

# ENTRYPOINT 定义了容器启动时运行的命令及可执行文件
ENTRYPOINT ["docker-entrypoint.sh"]

# CMD 提供了默认的参数给 ENTRYPOINT,这里是指定 MySQL 服务启动时的一些选项
CMD ["mysqld"]

 

ENTRYPOINT 设置为 ["docker-entrypoint.sh"],这是一个脚本,通常由基础镜像提供,用于处理一些初始化任务(如环境变量设置、权限调整等),然后它会进一步执行传入的命令。

通过使用 ENTRYPOINT,确保了即使用户在运行时指定了额外的参数,这些参数也会作为 docker-entrypoint.sh 的输入,保持了容器启动流程的一致性。

 

CMD 设置为 ["mysqld"],这是MySQL服务的启动命令。当没有在 docker run 命令后面附加额外命令时,容器将默认执行 docker-entrypoint.sh mysqld,启动 MySQL 服务。用户可以通过 docker run 命令行指定不同的命令或参数来覆盖 CMD,但这些将会作为 docker-entrypoint.sh 的参数,保持了 ENTRYPOINT 定义的执行流程不变。

这样的配置既保证了容器的核心启动逻辑(通过 ENTRYPOINT)不易被误改,又提供了灵活性(通过 CMD 定义默认行为,且允许用户覆盖)。

 

Link:https://www.cnblogs.com/farwish/p/18246677

标签:容器,CMD,命令,ENTRYPOINT,参数,docker,dockerfile
From: https://www.cnblogs.com/farwish/p/18246677

相关文章

  • caddy 入口 rootCmd 概览
     $goruncmd/caddy/main.go cmd/caddy/main.go(空壳) ->cmd/main.go (注册rootCmd) ->cmd/cobra.go (rootCmd实现) 以下是rootCmd中对Caddy的描述信息:Caddy是一个用Go语言编写的可扩展服务器平台,以其易用性和多功能性而著称。它核......
  • 禁止Windows用户使用cmd、powershell、注册表、*.bat脚本、修改网卡IP等操作
    如果你想让你的计算机或域控用户的计算机禁止使用cmd、powershell、注册表、bat脚本、修改网卡IP等操作1. 使用本地组策略(如果是本地用户)如果是非域用户,如果你在Windows10Pro或更高版本上,可以使用本地组策略(LocalGroupPolicy)来限制访问。打开“本地组策略编辑器”(gpedit.......
  • SQLCMD 密码中的 K8S 秘密用法始终为空
    我试图使用K8Ssecret密码连接到SQL服务器,但无论我使用什么语法或方法,密码总是空的。如果我硬编码密码,则一切正常。我还可以使用此命令在POD中打印密码,它还会返回存储在密码中的密码,因此POD可以实际访问密码。kubectlexec-itpodname--printenvMSS......
  • 在Powershell或CMD中使用conda命令
    近日在配置环境时希望能在Terminal中直接使用conda命令而不是使用AndacondaPrompt.步骤控制面板-搜索“环境变量”-环境变量(或者直接在系统中搜索“环境变量”)点击“环境变量”的按钮,在弹出的窗口中找到系统变量-Path-编辑新增,填写你的conda的Script文件夹路径,保存注......
  • cmd常用命令
    一、启动cmd方式用户启动,Win+r输入cmd,Enter管理员启动,Win+r输入cmd,Ctrl+Shift+Enter二、文件夹命令进入文件夹cdD:\build\typora\file返回上一级cd..跳转到根目录cd\跳转指定路径(假设现在在D:\typora跳转到D:\网页下载)cdD:\网页下载打开文件夹......
  • c++的无限cmd病毒
    1.简单介绍c++的windows.h库里有很多老师不告诉你的函数,有一个函数叫MessageBox,用法如下MessageBox(...,"...","...",...);比如MessageBox(0,"点赞吧","提示",0);效果如下 还有一个函数,跟MessageBox差不多,叫MessageBoxA,使用方法为MessageBoxA(...,"...","..."......
  • 打开cmd的方式和dos基本命令
    DOS的基本命令打开CMD的方式1.开始+系统+命令提示字符2.Win键+R输入CMD打开控制台(推荐使用)3.在任意文件下面,按shift键+鼠标右击,在此处打开命令行窗口常用的DOS命令1.#盘符切换D:2.#查看当前目录下的所有文件dis3.#切换目录cdchangedirectory4.#cd..返回上一级5.#......
  • Dockerfile编写级联构建参考
    Dockerfile编写级联构建Dockerfile级联构建是一种常见的技术,用于分阶段构建Docker镜像。这种方法可以帮助您优化镜像大小并减少构建时间。Dockerfile级联构建优点:分离了构建和运行环境,避免了不必要的依赖关系和文件,从而创建了一个更小、更安全的最终镜像。构建阶段可以......
  • u-boot bootcmd
    在U-Boot的环境变量中,`bootcmd`是一个关键的变量,它定义了当U-Boot启动时应该执行的命令序列。在你给出的`bootcmd`中,它执行了一系列的命令来引导Linux内核。我们一步步来分析这个`bootcmd`的内容:1.**setenvbootargs${bootargs}** *这行命令设置(或覆盖)了`bootargs`变......
  • windows batch cmd 批处理命令之 系统内置变量
    大部分环境变量, 在powershell中 可以用下面这条命令显示出来lsenv: 绝对路径是指调用绝对的程序位置的路径,例如:startC:\Windows\test.exe相对路径是文件改变路径以后还会按照变量的路径所在位置去调用,例如:start%WINDIR%\test.exe假如把系统安装在了D盘,使用......