要构建 Docker 镜像,需要使用 Dockerfile,其中包含指令。这些指令分别是 CMD、RUN 和 ENTRYPOINT,用于定义 Docker 镜像的多个方面。由于工作原因,开发人员常常会对它们感到困惑。
本博客将列出并解释RUN、CMD和ENTRYPOINT命令之间的多种差异。
在 Dockerfile 中 RUN、CMD 和 ENTRYPOINT 之间有什么区别?
RUN 用于执行命令指令并创建新的镜像层。CMD 用于设置在容器启动后默认执行的命令及其参数。ENTRYPOINT 配置容器启动时要执行的命令,从功能的角度来看,类似于 CMD。
让我们通过下面提供的指令来检查 RUN、CMD 和 ENTRYPOINT 的工作原理。
首先,创建一个Dockerfile,并将以下代码粘贴到其中,该代码包含alpine基础镜像和Docker容器的RUN运行指令:
FROM alpine
RUN ["echo", "My new image created"]
之后,运行 docker build 命令来使用 Dockerfile 构建 Docker 镜像:
docker build -t alphine_img .
如您所见,Dockerfile 中提供的指令在构建镜像时已被执行:
接下来,通过运行以下命令检查现有图像的列表:
docker images
正如您所看到的,特定的图像已成功创建:
现在,在现有的Dockerfile中添加将在容器启动时执行的CMD指令:
FROM alpine
RUN ["echo", "My new image created"]
CMD ["Hi Welcome to my LinuxHint World!!"]
完成后,通过执行提供的命令构建新的 Docker 镜像:
docker build -t alphine_img1 .
现在,使用docker run命令创建一个Docker容器:
docker run --name gol_con1 alphine_img1
正如你所看到的,容器已创建,并且CMD指令已成功执行:
要覆盖CMD指令的内容,现在请执行以下命令构建一个带有新指令的容器:
docker run --name gol_container alphine_img1 "it's my LinuxHint
World"
上述命令的输出显示 CMD 指令已经被覆盖:
现在,在之前创建的Dockerfile中添加ENTRYPOINT指令,这将告诉容器的入口点:
FROM nginx:latest
COPY t_prg.html /usr/share/nginx/html/index.html
ENTRYPOINT ["nginx", "-g", "daemon off;"]
然后,通过执行以下命令来构建新镜像:
docker build -t oreo_img .
接下来,运行docker images命令以列出所有现有的镜像:
docker images
正如您所看到的,新创建的图像存在于列表中:
现在,运行以下命令以生成带有图像的容器:
docker run -d --name=sticky_con oreo_img:latest
最后,通过运行ls命令列出容器的内容:
ls
就是这样!我们已经描述并用示例说明了 RUN、CMD 和 ENTRYPOINT 之间的一些区别。
结论
在Docker中,RUN用于执行命令指令并创建新的镜像层。而CMD用于设置命令及其参数,ENTRYPOINT配置容器启动时执行的命令。这篇博客说明了RUN、CMD和ENTRYPOINT之间的一些重要区别。