我是 CICD 的新手,试图了解 docker。
在使用调用 dockerfile 构建 docker 镜像的 jenkins 管道部署 Django 应用程序时。 dockerfile 调用 runner.sh,其中包含以下代码行:
uwsgi --http "0.0.0.0:${PORT}" --module my_proj.wsgi --master --processes 4 --threads 2
一切正常,但我很想知道为什么当此映像在主机服务器上运行时,此代码在构建 docker 映像和运行应用程序时不运行应用程序。
在这种情况下,我尝试在 dockerfile 中运行应用程序,同时部署 jenkins 管道在运行应用程序时卡住并保持卡住,因为应用程序将在构建图像时继续运行。
,但我很想知道为什么当此映像在主机服务器上运行时,此代码在构建 docker 映像和运行应用程序时不运行应用程序。
我假设
runner.sh
在您的docker镜像中被指向ENTRYPOINT
。 ENTRYPOINT 的目的是在 docker 镜像的运行状态下执行命令/脚本。
那么问题来了,为什么是run状态下执行,而不是build状态。因为这条命令与搭建docker环境无关。相反,此命令运行您的应用程序。这个过程不会停止,直到它被明确强制停止(比如使用 ctrl+c)。因此,如果您将此命令置于构建状态,即在 Dockerfile 中使用
RUN ...
,它将不会完成构建,因为该命令一直在运行。
在这种情况下,我尝试在 dockerfile 中运行应用程序,同时部署 jenkins 管道在运行应用程序时卡住并保持卡住,因为应用程序将在构建图像时继续运行。
关于这一点,你的 Jenkins 管道的目的是构建 docker 镜像,将镜像二进制文件发送到部署环境,该镜像将处于可执行状态。因此,将此命令置于 dockerfile 的构建状态不是一个好主意。