Dockerfile中的CMD和ENTRYPOINT

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: **Dockerfile 中的 `CMD` 和 `ENTRYPOINT` 用于设定容器启动行为。`CMD` 提供默认命令,可被 `docker run` 覆盖;`ENTRYPOINT` 设置不可变的入口点,其参数与 `CMD` 结合使用。两者皆有两种语法格式:数组和字符串。`ENTRYPOINT` 与 `CMD` 结合允许用户覆盖默认参数,但若需替换 `ENTRYPOINT`,需使用 `--entrypoint`。**

在 Dockerfile 中,CMDENTRYPOINT 命令都用于指定容器启动时要执行的命令或可执行文件,但它们之间存在一些重要的区别。

CMD 命令

CMD 命令用于为容器指定默认的命令和参数。在一个 Dockerfile 中,通常只会有一个 CMD 命令,它可以有多个参数,这些参数通常是要执行的命令及其参数。当你使用 docker run 启动容器时,如果没有提供要运行的命令,Docker 会使用 CMD 中的命令作为默认命令来启动容器。

CMD 命令的语法有两种:

  1. 使用字符串数组的形式:

Dockerfile

  1. 复制代码
CMD ["executable","param1","param2"]
  1. 使用字符串的形式:

Dockerfile

  1. 复制代码
CMD command param1 param2

如果你在 Dockerfile 中指定了多个 CMD 命令,只有最后一个 CMD 命令会生效。

示例:

Dockerfile

复制代码

# 使用字符串数组形式
CMD ["python", "app.py"]

# 使用字符串形式
# CMD python app.py

在这个示例中,如果你不在 docker run 命令中提供要运行的命令,容器将默认运行 python app.py

ENTRYPOINT 命令

ENTRYPOINT 命令用于配置容器的入口点可执行文件或命令。与 CMD 不同,ENTRYPOINT 命令的参数不会被覆盖,而是作为容器启动时运行的主要命令。你可以将 ENTRYPOINT 命令与 CMD 命令结合使用,以为容器提供默认参数。

ENTRYPOINT 命令的语法也有两种:

  1. 使用字符串数组的形式:

Dockerfile

  1. 复制代码
ENTRYPOINT ["executable","param1","param2"]
  1. 使用字符串的形式:

Dockerfile

  1. 复制代码
ENTRYPOINT command param1 param2

CMD 不同,ENTRYPOINT 命令的参数不会被忽略,而是会被传递给 ENTRYPOINT 命令所指定的可执行文件或命令。

示例:

Dockerfile

复制代码

# 使用字符串数组形式
ENTRYPOINT ["python", "app.py"]

# 使用字符串形式
# ENTRYPOINT python app.py

在这个示例中,如果你在 docker run 命令中提供了额外的参数,例如 docker run my-container arg1 arg2,这些额外的参数会被传递给 python app.py

总结:

  • CMD 用于指定容器启动时默认要执行的命令,但可以被 docker run 命令中的命令覆盖。
  • ENTRYPOINT 用于指定容器的入口点命令或可执行文件,参数不会被覆盖,而是会与 CMD 结合使用,提供默认参数。如果在 docker run 命令中提供了额外的参数,它们会被附加到 ENTRYPOINT 后面。

组合使用

CMDENTRYPOINT 可以结合使用,这意味着 CMD 中的命令参数将会被传递给 ENTRYPOINT 中指定的命令或可执行文件。这样的结合可以使容器更灵活,允许用户在运行容器时覆盖 CMD 中的默认参数。

下面是一个示例,演示了如何在 Dockerfile 中结合使用 CMDENTRYPOINT

Dockerfile

复制代码

# 使用 ENTRYPOINT 指定默认的可执行文件
ENTRYPOINT ["echo", "Hello,"]

# 使用 CMD 指定默认的参数
CMD ["world!"]

在这个示例中,ENTRYPOINT 指定了默认的可执行文件为 echo,而 CMD 指定了默认的参数为 "world!"。当你运行容器时,可以覆盖 CMD 中的参数,例如:

bash

复制代码

docker run my-container "Goodbye!"

运行上述命令后,容器将输出:

复制代码

Hello, Goodbye!

注意以下几点:

  1. CMD 中的参数可以被 docker run 命令中的参数覆盖,但 ENTRYPOINT 中的参数不会被覆盖。
  2. 如果在 docker run 命令中不提供任何额外的参数,容器将执行 ENTRYPOINT 中指定的命令,并使用 CMD 中的参数作为默认参数。
  3. 如果你希望完全替换 ENTRYPOINT 中的命令而不是附加参数,可以在 docker run 命令中使用 --entrypoint 选项,例如:

bash

复制代码

docker run --entrypoint /bin/sh my-container

这将使用 /bin/sh 作为新的 ENTRYPOINT 命令,忽略掉 CMD 中的参数。

总结

  1. CMD 指令
  • 定义容器启动时的默认命令和参数。
  • 如果 docker run 时没有指定命令,将使用 CMD 指定的命令。
  • Dockerfile 中只能有一个有效的 CMD 指令,多个 CMD 的情况下,只有最后一个会生效。
  • 有两种语法形式:数组形式(推荐)和字符串形式。
  1. ENTRYPOINT 指令
  • 配置容器的入口点命令或可执行文件。
  • ENTRYPOINT 的参数不会被覆盖,而是作为容器启动的主命令。
  • 也有两种语法形式:数组形式(推荐)和字符串形式。
  • 可以与 CMD 结合使用,CMD 中的参数将作为 ENTRYPOINT 的附加参数。
  1. CMD 和 ENTRYPOINT 的组合
  • 这种组合增加了灵活性,允许用户覆盖 CMD 的默认参数。
  • ENTRYPOINT 指定执行文件,CMD 提供默认参数。
  • 如果 docker run 时指定了参数,它们会覆盖 CMD 的参数,但不会影响 ENTRYPOINT
  1. 替换 ENTRYPOINT
  • 使用 docker run 命令的 --entrypoint 选项可以完全替换 Dockerfile 中定义的 ENTRYPOINT

转载来源:https://juejin.cn/post/7317882649275580468

相关文章
|
Web App开发 域名解析 缓存
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
本文我们主要为大家介绍在 Ubuntu 20.04 上安装 Node.js 和 npm 的三种不同的方式。
166505 7
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
|
4月前
|
人工智能 Cloud Native 关系型数据库
云栖重磅|瑶池数据库:从云原生数据底座向“AI就绪”的多模态数据底座演进
瑶池数据库:从云原生数据底座向“AI就绪”的多模态数据底座演进
|
Linux 数据安全/隐私保护 Windows
【JumpServer教程】简便添加Windows资产:JumpServer堡垒机使用指南
本文是JumpServer堡垒机使用指南,介绍了如何在JumpServer中简便添加Windows资产的步骤,包括准备工作、开启Windows远程设置、在JumpServer中配置Windows资产以及授权使用。
3746 1
【JumpServer教程】简便添加Windows资产:JumpServer堡垒机使用指南
|
网络协议
iperf3的常用命令样例
iperf3是一个用于测量网络带宽的工具,以下是一些常用的iperf3命令样例: 1. 在服务器模式下启动iperf3: ``` iperf3 -s ``` 2. 在客户端通过TCP连接测试带宽: ``` iperf3 -c <服务器IP地址> ``` 3. 在客户端通过UDP连接测试带宽: ``` iperf3 -c <服务器IP地址> -u ``` 4. 指定连接端口号: ``` iperf3 -c <服务器IP地址> -p <端口号> ``` 5. 设置测试时间: ``` iperf3 -c <
2600 0
|
网络协议 安全 Linux
Linux的netns使用总结
Linux的netns(Network Namespace)是一项强大的网络隔离功能,可在内核层面创建多个独立的网络空间,每个空间配备独立的网络协议栈,包括接口、路由表及iptables规则等,确保不同应用或服务在网络环境中互不干扰,提升系统安全性和灵活性。通过`ip netns`命令可轻松管理netns,实现创建、删除及执行命令等功能。netns适用于容器技术、虚拟化环境及网络测试等多种场景,为用户提供高效、安全的网络环境管理方案。
1263 3
|
机器学习/深度学习 并行计算 算法
掌握XGBoost:GPU 加速与性能优化
掌握XGBoost:GPU 加速与性能优化
2574 0
|
存储 Oracle 关系型数据库
|
Rust Python
Python 解析 toml 配置文件
Python 解析 toml 配置文件
619 1
|
运维 监控 安全
SD-WAN异地组网加速:提升企业网络性能的关键
随着企业全球化扩展,异地组网成为重要需求。传统广域网(WAN)存在延迟高、带宽不足等问题,而SD-WAN通过智能流量调度、降低成本、提升安全性和快速部署等优势,成为理想解决方案。本文详细解析SD-WAN在异地组网中的优势、应用场景及最佳实践,帮助企业实现高效跨地域网络连接。
EMQ
|
机器学习/深度学习 边缘计算 JSON
车联网 CAN Bus 协议介绍与数据实时流处理
CAN Bus 是一种串行通信协议,能够让设备之间可靠而高效地传输数据。本篇博客将探讨使用 CAN Bus 中遇到的挑战,以及如何用 eKuiper 和 MQTT 解决这些问题。
EMQ
777 0
车联网 CAN Bus 协议介绍与数据实时流处理