当前位置:首页 > 编程语言 > 正文内容

关于Dockerfile ENTRYPOINT你需要知道的一切

a811625532年前 (2023-08-29)编程语言17


ENTRYPOINT 是 Docker 最重要的配置选项之一。它位于 Dockerfile 中,允许你指定容器的默认行为。这一功能使得 ENTRYPOINT 对于在运行时自动执行容器的行为非常有帮助。

本文将深入探讨 ENTRYPOINT 在 Docker 中的使用,包括它的工作原理、为什么它必不可少以及如何正确配置它。

Docker ENTRYPOINT 解读

ENTRYPOINT 是 Docker 容器运行过程的起点。并将其实例化为容器时,默认情况下会执行 ENTRYPOINT 命令。

ENTRYPOINT 允许你设置容器的主要用途,如运行 *** 服务器、数据库或应用程序。它还允许你在运行时传递参数,自定义容器的行为。

ENTRYPOINT 的语法和用法

Dockerfile 中定义 ENTRYPOINT 的两种语法选项是 shell 形式和执行形式。这两种 *** 都需要在 Dockerfile 中插入一行。由于 ENTRYPOINT 配置并不直接影响构建过程,因此你可以把它放在文件的任何地方。不过,大多数程序员倾向于将 ENTRYPOINT 命令放在最后。

Shell 表单语法

ENTRYPOINT 使用 shell 形式运行时,它会调用命令 shell 进行处理。这种 *** 包括环境变量替换,但阻止了在执行形式中追加参数的功能:

ENTRYPOINT command param1 param2

这里,command 是在容器启动时执行的主要命令。 param1param2 是该命令的参数。

Exec 表单语法

Exec 表单不会调用命令 shell。相反,它会直接执行指定的命令和参数。这种 *** 允许你通过 CMD 或运行时命令行添加参数:

ENTRYPOINT ["executable", "param1", "param2"]

这里,executable 是主命令, param1 param2 是可执行文件的参数。

动作中的 ENTRYPOINT

让我们为 Dockerfile 组建一个简单的 ENTRYPOINT 命令,看看它是如何工作的。在不启动容器的情况下无法测试它,因为它的指令是在运行时而不是在构建时处理的。

下面是一个使用执行形式的示例:

ENTRYPOINT ["python", "app.py"]

当容器启动时,它会启动 解释器并执行 app.py 脚本,作为容器的默认行为。

要使用 shell 表单重复此示例,需要稍作改动:

ENTRYPOINT python app.py

本例从 shell 命令启动 Python 解释器,而不是直接运行它。

使用 CMD 的 ENTRYPOINT

CMD 是一条 Dockerfile 指令,为正在执行的容器提供默认参数。这些参数可以是可执行命令的形式,也可以作为 ENTRYPOINT 指令的附加参数。启动容器时,你可以通过向 docker run 指令提供参数来覆盖这些参数。

ENTRYPOINT 一样,你也可以以 exec 或 shell 的形式编写 CMD 。主要区别在于, CMD 设置了默认命令或参数,你可以在命令行中覆盖它们。而 ENTRYPOINT 会将容器配置为可执行文件运行,这意味着你无法在命令行中覆盖命令。

你可以使用 CMD 扩展 ENTRYPOINT 的功能,让你的映像具有更大的灵活性。将二者结合起来,你就可以自定义映像的行为,并将 CMD 值作为 ENTRYPOINT 指令的默认参数。通过这种 *** ,您可以通过 ENTRYPOINT 设置默认命令,并通过 CMD 设置默认参数。

与单独使用 ENTRYPOINT 不同,这种 *** 允许你覆盖在  docker run 指令时传递的参数。

为了使上述示例更加灵活,你可以加入 CMD 命令:

ENTRYPOINT ["python", "app.py"]
CMD ["--help"]

在本例中,启动 Docker 容器时不提供任何命令行参数,这意味着 python app.py --help 将默认执行。不过,在启动容器时提供参数(如 docker run <image> --version )将取代默认的 CMD 参数,从而执行 python app.py--version 。这种 *** 让你在运行容器时有更大的灵活性。

Docker 中的 ENTRYPOINT 使用案例

ENTRYPOINT 最常见的用途是为特定应用程序或服务设置镜像。例如,如果创建运行 Python 应用程序的映像,就可以使用 ENTRYPOINT 来指定运行 Python 解释器。

在为持续集成和持续部署(CI/CD)管道构建 Docker 映像时,也可以使用 ENTRYPOINT 。您可以使用这些映像来封装每个阶段所需的环境,以确保一致性。例如,你可以创建一个将 ENTRYPOINT 设置为测试脚本的 Docker 镜像。该镜像每次运行时都会自动执行这些测试,从而提供一致、可重复的测试环境。

ENTRYPOINT 对于调试容器化应用程序也很有用。通过使用 ENTRYPOINT 启动 shell 会话,你可以与容器内的应用环境进行交互。这些交互包括执行命令、查看文件和检查应用程序的状态。一旦问题得到解决,就可以使用相应的 ENTRYPOINT 重建 Docker 镜像来运行应用程序。

如何覆盖 ENTRYPOINT

为了增加灵活性,我们可以在运行时覆盖 Docker 镜像的 ENTRYPOINT 。你可以在 docker run 命令中的映像名称后面提供一个命令来实现这一点。

例如,如果你的映像的 ENTRYPOINT 是 Python 脚本,但你想在容器内打开一个 shell,你可以运行下面的命令:

docker run --entrypoint <image> “/bin/bash”

该脚本会覆盖应用程序的默认 ENTRYPOINT ,并启动一个 bash shell。

同样,要运行不同的 Python 脚本,也可以提供该脚本作为命令。这种 *** 让你可以灵活地使用与 Dockerfile 的 ENTRYPOINT 中最初描述的参数不同的参数来运行容器。

在 Docker 中使用 ENTRYPOINT 的更佳实践

因为 ENTRYPOINT 是 Docker 的关键命令,所以必须遵循这些更佳实践来更大限度地利用它。

让容器专注于单一责任

ENTRYPOINT 指定了 Docker 容器的职责。与微服务一样,每个容器应专注于单一职责、服务或应用程序的一部分。这种 *** 提高了应用程序的模块性和可扩展性,使其更易于开发、测试和维护。

确保 ENTRYPOINT 脚本可执行且格式正确

使 ENTRYPOINT 脚本可执行且格式正确,可以防止出现语法和权限错误等问题。

要确保 ENTRYPOINT 脚本可执行,可以使用以下 RUN chmod +x 指令:

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

本例将 entrypoint.sh 脚本复制到容器中,并使用 RUN chmod +x 指令使其可执行。然后定义 ENTRYPOINT 以使用 entrypoint.sh 脚本。

你还可以使用 ShellCheck 这样的内部程序来检查脚本的语法和样式,以确保格式正确。

避免在 ENTRYPOINT 脚本中硬编码值

使用环境变量或命令行参数而不是硬编码可以让你的脚本更灵活。它还能让你在容器外部配置文件路径。

例如,在 ENTRYPOINT 脚本中,你可以这样来代替硬编码文件路径:

#!/bin/bash
echo "starting my application..."
./my-app -f /path/to/my/file.txt

您可以使用这样的变量:

#!/bin/bash
echo "Starting my application..."
./my-app -f "${MY_FILE}"

使用变量能让你的镜像具有更强的即时定制能力,让你在不重写 Dockerfile 的情况下做更多事情。

小结

ENTRYPOINT 是配置 Docker 容器的重要工具。它设置了容器从映像启动时执行的默认命令,定义了容器的主要功能。你可以使用 ENTRYPOINT 运行特定的应用程序,在 CI/CD 管道中提供帮助,或与 CMD 结合使用以获得更灵活的容器行为。

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://2345hao.cn/blog/index.php/post/8057.html

分享给朋友:

“关于Dockerfile ENTRYPOINT你需要知道的一切” 的相关文章

宝塔面板教程之安全管理篇

宝塔面板教程之安全管理篇

宝塔面板的安全管理可以设置SSH开关、禁用PING、放行端口、屏蔽IP等相关的操作。 SSH的设置 SSH的关闭与启动,点击下图的开关,即可开启或关闭SSH远程连接。 SSH端口的修改,SSH远程连接的默认端口为22,修改端口前,请先查看该端口是否被占用。 PING命令的...

宝塔面板教程之文件管理篇

宝塔面板教程之文件管理篇

宝塔面板其中一个最为便捷的功能之一,无需SFTP或者FTP即可对服务器的文件内容进行上传、下载、编辑及删除等管理操作。 文件管理,用于管理该服务器上的文件内容。 文件的基础操作 文件的基础操作有哪些了,主要有这些方面:复制、粘贴、剪切、删除、重命名、压缩、刷新、新建文件、新建目录。...

什么是Node.js以及为什么要使用它

什么是Node.js以及为什么要使用它

JavaScript是世界上最流行的编程语言之一。今天,它为数百万个网站提供支持,并吸引了成群的开发人员和设计人员为Web构建功能。如果您是编程新手,那么 JavaScript很容易成为之一。 在最初的20年里,JavaScript主要用于客户端脚本。由于JavaScript只能在<scr...

15种最佳编程字体以帮助您更愉悦地敲代码

15种最佳编程字体以帮助您更愉悦地敲代码

经过几个小时的努力工作后,您是否感到眼睛疲劳或难以阅读代码?许多程序员在开始头疼之前从没想过要切换字体。 如果您经常发现在尝试扫描一千行代码时眼睛模糊不清,或者在停止编码数小时后头疼,那么可能是时候尝试一种新字体了。即使您没有遇到这些症状,设计良好的字体通常也比默认系统字体具有更好的可读性。...

20个最佳Laravel免费和付费教程资源

20个最佳Laravel免费和付费教程资源

Laravel多年来一直是PHP应用程序开发的摇滚明星,这是有充分理由的。庞大的生态系统、活跃的社区、强大的就业市场、成功的初创公司——它拥有一切让采用新技术变得值得的东西。 如果你想学习Laravel,你不需要更进一步。通过浏览本指南,您可以找到最适合您的Laravel教程,与您的知识水平和...

PostgreSQL与SQL Server之间的16个关键差异

PostgreSQL与SQL Server之间的16个关键差异

市场上有各种各样的数据库可供选择,用户通常可以仔细考虑PostgreSQL与SQL Server,以便为他们的用例找出更好的选择。使用PostgreSQL进行运营的组织可能希望切换到像Microsoft SQL Server这样的数据库,因为它主要迎合不同的数据仓库解决方案、电子商务和其他业务线...