Docker ENTRYPOINT 详解及示例 26

作者 : 慕源网 本文共3011个字,预计阅读时间需要8分钟 发布时间: 2021-12-15 共502人阅读

Docker ENTRYPOINT介绍

Docker entrypoint 是一个 Dockerfile 指令,用于Docker 为镜像指定容器启动后的命令。指定从 Docker 镜像启动容器时应运行的可执行文件。它有两种形式,第一种是“exec”形式,第二种是“shell”形式。如果 Docker 镜像中没有指定entrypoint 或 CMD,它会同时启动和退出,这意味着容器会自动停止,因此,我们必须指定entrypoint 或 CMD,以便在启动容器时它应该执行某些操作而不是要停止。

语法:

正如所讨论的,Docker entrypoint 有两种形式,因此我们有两种不同的语法,如下所示:

‘exec’ 形式语法:

ENTRYPOINT [“executable”, “param1”, “param2”, ..]

当我们运行容器时将启动的可执行文件,“param1”和“param2”是我们必须传递给该可执行文件的参数。

“shell”语法:

ENTRYPOINT command param1 param2

其中 command 是我们启动容器时想要运行的 shell 命令或任何可执行文件,param1 和 param2 是参数。

entrypoint 如何在 Docker 中工作?

Docker ENTRYPOINT 允许我们可以在启动容器时指定命令。当我们在运行时指定命令时,两种形式的 Docker entrypoint 的执行方式不同。

  • ‘exec’ 形式允许我们为 ‘docker run’ 命令指定命令行参数,它被附加到 ‘exec’ 形式的所有元素的末尾,这意味着指定的命令将在entrypoint 中指定的可执行文件之后运行。例如,如果我们将 ‘-d’ 参数传递给 ‘docker run’ 命令,那么 Docker 守护进程会将该参数传递给entrypoint ,并且指定的可执行文件将在后台运行。
  • ‘shell’ 形式不允许在启动容器时指定任何命令或 ‘docker run’ 命令行参数,因为 ENTRYPOINT 命令作为 ‘/bin/sh -c’ 的子命令运行。可执行文件的 PID 与容器的“PID 1”不同,因此如果我们从“docker stop”命令传递任何 Unix 信号(如 SIGTERM),则可执行文件不会收到它。

我们可以在使用“–entrypoint”标志启动容器时覆盖 ENTRYPOINT 指令。此外,如果docker entrypoint 多条指令,那么只有最后一个 ENTRYPOINT 将起作用。

Docker entrypoint 点示例

让我们通过一些例子来理解在 Docker entrypoint 上的工作。

示例 #1 –ENTRYPOINT   ‘exec’语法

我们想使用 Ubuntu 作为基础镜像创建一个 nginx Docker 镜像,并且还想在我们自动运行容器时启动 nginx。

  1. 我们必须首先使用 ‘exec’ 形式的 ENTRYPOINT 创建一个 Dockerfile,如下所示:
    FROM ubuntu
    RUN apt-get update && apt-get install -y nginx
    ENTRYPOINT ["nginx", "-g", "daemon off;"]
  2. 使用上面的 Dockerfile 构建 Docker 镜像,如下所示:
    docker build -t my-app.
  3. 使用这个新的 Docker 镜像运行一个容器,并使用 ‘docker exec’ 命令连接到新创建的容器,如下所示:
    docker run -d --name my-web my-app
    docker exec -it my-web sh

  4. 现在,如果我们在容器内运行“top”命令,我们可以看到“nginx”已经以“PID 1”运行。

示例 #2 –ENTRYPOINT  ‘shell’ 语法

我们将使用与上述相同的场景,但是,我们将 Dockerfile 中的 ENTRYPOINT 从 ‘exec’ 替换为 ‘shell’,如下所示:

  1. 让我们使用 build 命令构建 Docker 镜像,如下所示:
    docker build -t  my-app:v2 .
  1. 现在,使用上面的 Docker 镜像运行一个容器并连接到新创建的容器并检查 nginx 可执行文件的 PID:
docker run -d --name my-web2 my-app:v2
docker exec -it my-web2 sh

说明:在上面的快照中,我们可以看到 ‘sh’ 命令在 ‘PID 1’ 下运行。这是因为 nginx 现在作为 ‘/bin/sh -c’ 命令的子命令运行。

  1. 这样,我们无法使用“docker stop”命令正确停止长时间运行的 ENTRYPOINT 可执行文件。如果我们想正确停止可执行文件,我们必须在 Dockerfile 中的可执行文件之前使用“exec”,如下所示:
FROM ubuntu
RUN apt-get update && apt-get install -y nginx
ENTRYPOINT exec nginx -g “daemon off;”
  1. 为了验证它是否按预期工作,创建一个新的 Docker 镜像名称“my-app:v3”并使用它运行一个容器,一旦容器启动,连接到它并再次检查 nginx 可执行文件的 PID:
docker run -d --name my-web3 my-app:v3
docker exec -it my-web3 sh

说明:在上面的快照中,我们可以看到 nginx 可执行文件现在的 PID 为 1。

示例 #3

我们想查看正在运行的容器的entrypoint 。我们可以通过使用带有“format”标志的“inspect”命令或“docker ps”命令来获得更清晰的输出,如下所示:

docker inspect my-web2

docker ps --format "table  {{.ID}} \t {{.Names}} \t {{.Command}}" --no-trunc

示例 #4 docker entrypoint 覆盖

我们想在启动容器时覆盖entrypoint 。我们为此设置了“–entrypoint”标志。我们可以使用“–entrypoint”标志来传递如下命令:

docker run -d --entrypoint sh --name my-web4 my-app
docker run -d --entrypoint sh --name my-web5 my-app:v2
docker run -d --entrypoint sh --name my-web6 my-app:v3

docker ps -a --format "table {{.ID}} \t {{.Names}} \t {{.Command}}" --no-trunc

说明:在上面的快照中,我们可以看到容器“my-web4”、“my-web5”和“my-web6”正在显示命令“sh”,因为entrypoint 已被覆盖。

好处:

  1. 它允许我们创建容器可执行文件。
  2. 如果需要,它可以灵活地指定额外的命令行参数。

结论

现在,我们知道 Docker entrypoint 有两种形式,但是,“exec”形式更可取。docker entrypoint cmd 区别,我们在 Docker ENTRYPOINT 中获得了一些优于 CMD 的优势。大多数 Docker 基础镜像都有一个 shell,例如 /bin/sh 或 /bin/bash 作为 CMD 可执行文件,例如 ubuntu、busybox、debian 等。

推荐文章

这是 Docker 入口点的指南。这里我们也讨论了介绍以及入口点在docker中是如何工作的?以及不同的示例及其代码实现。

本文是docker快速入门教程系列的一部分您也可以查看以了解更多信息 –

 

 


慕源网 » Docker ENTRYPOINT 详解及示例 26

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录