在 Dockerfile 中,RUN、CMD 和 ENTRYPOINT 这三条指令看起来相似,它们的作用都是在 Docker 镜像构建过程中运行指定的命令。有时候很容易造成混淆,接下来我们来详细探讨它们之间的区别。
docker run
命令行参数来覆盖。它主要用于为容器设定默认启动行为。如果 Dockerfile 中有多个 CMD 指令,只有最后一个生效。docker run
时指定了其他命令,ENTRYPOINT 也不会被忽略,而是会与这些命令结合使用(除非使用 --entrypoint
覆盖)。当容器作为应用程序或服务运行时,推荐使用 ENTRYPOINT,并且最好采用 Exec 格式。我们可以通过两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell格式和Exec格式,这两种格式在使用上有一些微妙的差异。
Docker中的 RUN
, CMD
, 和 ENTRYPOINT
指令都可以采用两种不同的运行格式来指定要执行的命令:
Shell格式如下所示:
<instruction> <command>
例如:
RUN apt-get install python3
CMD echo "Hello world"
ENTRYPOINT echo "Hello world"
当执行命令时,Shell 格式的底层会使用 /bin/sh -c <command>
。当你以Shell格式运行命令时,由 ENV 命令定义的环境变量可以被获取到。
ENV name Cloud Man
ENTRYPOINT echo "Hello, $name"
输出:
Hello, Cloud Man
Exec格式如下所示:
<instruction> ["executable", "param1", "param2", ...]
例如:
RUN ["apt-get", "install", "python3"]
CMD ["/bin/echo", "Hello world"]
ENTRYPOINT ["/bin/echo", "Hello world"]
当执行命令时,<command>
将被直接调用,不会被shell解析。在 ENV 中定义的环境变量也没法获取到。
ENV name Cloud Man
ENTRYPOINT ["/bin/echo", "Hello, $name"]
输出:
Hello, $name
推荐使用Exec格式进行CMD和ENTRYPOINT的指定,因为这样指令更易于阅读和理解。
RUN命令通常用于安装应用程序和软件包。RUN 在当前镜像之上执行命令,并通过创建一个新的镜像层。Dockerfile 通常包含多个RUN指令。
CMD指令允许用户指定容器默认执行的命令。当容器启动并且没有为docker run指定其他命令时,此命令将运行。
CMD有三种格式:
推荐使用Exec格式,因为它提供了更好的可读性。
The ENTRYPOINT
directive allows the container to run as an application or service.
ENTRYPOINT在指定要执行的命令及其参数方面与CMD相似。不同之处在于,即使在运行docker run时指定了其他命令,ENTRYPOINT也不会被忽略,并且会被执行。
ENTRYPOINT有两种格式:
ENTRYPOINT中的参数始终被使用,而CMD的额外参数可以在容器启动时动态替换。例如:
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]
# Output
Hello world
请注意,ENTRYPOINT的Shell格式会忽略CMD或docker run提供的任何参数。
FROM busybox
ENTRYPOINT echo hello
CMD world
hello
Docker中的 --entrypoint
命令行选项允许你在运行容器时覆盖Docker镜像中指定的ENTRYPOINT指令。
$ docker run --entrypoint="path/to/custom/entrypoint" imagename
默认情况下,当你运行一个Docker容器时,会执行镜像中ENTRYPOINT指令指定的命令。但是,如果你想覆盖这种行为,可以使用 --entrypoint
选项来指定一个不同的入口点来使用。有时这对容器内部环境问题的调试很有帮助。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。