1、简要概述
- RUN: 执行命令并创建新的镜像层,RUN 经常用于安装软件包。
- CMD: 设置容器
启动后
默认执行的命令及其参数,但CD能够被docker run后面跟的命令行参数替换。 - ENTRYPOINT: 配置容器
启动时
运行的命令。
2. Shell 和 Exec 格式
- 两种方式指定RUN、CMD和ENTRYPOINT要运行的命令:Shell格式和Exec格式,二者在使用上有细微的区别。
- Shell 格式:
<instruction> <command>
例如:
RUN apt-get install python3
CMD echo "Hello world"
ENTRYPOINT echo "Hello world"
当指令执行时,shell 格式底层会调用
/bin/sh -c [command]
。会解析 <command> 中带有的变量。
例如:
ENV name Cloud Man
ENTRYPOINT echo "Hello, $name"
输出:
Hello, Cloud Man
- Exec 格式。
<instruction> ["executable", "paraml", "param2", ...]
例如:
RUN [ "apt-get", "install","python3"]
CMD ["/bin/echo", "Hello world"]
ENTRYPOINT ["/bin/echo","Hello world"]
当指令执行时,会直接调用 [command],不会被 shell 解析。
例如:
ENV name Cloud Man
ENTRYPOINT「"/bin/echo","Hello, $name"]
输出:
Hello,$name
如果希望使用环境变量:
ENV name Cloud Man
ENTRYPOINT ["/bin/sh", "-c", "echo hello, $name"]
输出:
Hello,Cloud Man
3. RUN
- RUN 指令通常用于安装应用和软件包。
- RUN 在当前镜像的顶部执行命令,并创建新的镜像层。Dockerfle中常常包含多个RUN指令。
- RUN 有两种格式:
- Shell 格式: RUN
- Exec 格式: RUN ["executable","paraml","param2"]
例子
RUN apt-get update && apt-get install -y vim
注意: apt-get update和apt-get install 被放在一个 RUN 指令中执行,这样能够保证每次安装的是最新的包。如果 apt-get install 在单独的 RUN 中执行,则会使用 apt-get update 创建镜像层,而这一层可能是很久以前缓存的。
4. CMD
CMD 指令允许用户指定容器的默认执行的命令。此命令会在容器启动且 docker run 没有指定其他命令时运行。
- 如果 docker run 指定了其他命令,CMD 指定的默认命令将被忽略
- 如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效。
CMD 有三种格式:
- Exec 格式: CMD ["executable","paraml","param2"] 这是 CMD 的推荐格式。
- CMD ["paraml","param2"] 为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式。
- Shell 格式: CMD command paraml param2
第二种格式 CMD ["paraml","param2"] 要与 Exec 格式的 ENTRYPOINT 指令配合使用,其用途是为 ENTRYPOINT 设置默认的参数。
CMD echo "Hello world"
运行容器 docker run -it [image]将输出:
Hello world
后面加上一个命令,比如
docker run -it [image] /bin/bash
,CMD 会被忽略掉,命令 bash 将被执行:
root@10a32dc7d3d3:/#
5. ENTRYPOINT
- ENTRYPOINT 指令可让容器以应用程序或者服务的形式运行。
- ENTRYPOINT 看上去与 CMD 很像,它们都可以指定要执行的命令及其参数。不同的地方在于 ENTRYPOINT 不会被忽略,一定会被执行,即使运行docker run 时指定了其他命令。
ENTRYPOINT 有两种格式:
- Exec 格式: ENTRYPOINT ["executable","param1","param2"] 这是 ENTRYPOINT 的推荐格式。
- Shell 格式: ENTRYPOINT command paraml param2.
- Exec 格式:
- ENTRYPOINT 的 Exec 格式用于设置要执行的命令及其参数,同时可通过 CMD 提供额外的参数。
- ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。
例如
ENTRYPOINT [ "/bin/echo","Hello" ]
CMD [ "world" ]
当容器通过 docker run -it [image] 启动时,输出为:
Hello world
如果通过
docker run -it [image] CloudMan
启动,则输出为:
Hello CloudMan
- Shell 格式
- ENTRYPOINT 的 Shell 格式会忽略任何 CMD 或 docker run 提供的参数。