- CMD RUN ENTRYPOINT均有两种方式指定命令,即Shell,Exec
CMD
- CMD ["param1","param2"] 为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式
- shell :
CMD <命令>
# Dockerfile CMD echo "hello docker" # 运行镜像输出 hello docker # 当有多个CMD命令 仅运行最后一个 # Dockerfile CMD echo "hello docker one" CMD echo "hello docker two" 运行镜像 仅会输出第二个 hello docker two ``` > 命令在底层实际执行过程中调用 `/bin/sh -c <command>` 即 `/bin/sh -c echo "hello docker"`
- exec:
CMD ["可执行文件", "参数1", "参数2"...]
# Dockerfile ENV name docker ENTRYPOINT ["/bin/echo", "Hello, $name"] # 输出 Hello, $name !!! 没有输出变量 , 因为指令执行时,会直接调用 <command>,不会被 shell 解析 ,echo便不能解析变量 ############################ ENV name docker ENTRYPOINT ["/bin/sh"," -c ", "echo Hello, $name"] # hello docker
ENTRYPOIN
- Exec 格式:
ENTRYPOINT ["executable", "param1", "param2"]
这是 ENTRYPOINT 的推荐格式# Dockerfile ENTRYPOINT ["/bin/echo", "Hello"] CMD ["world"] # docker run -it [image] 运行后输出 hello world # docker run -it [image] "命令行" 运行后输出 hello 命令行
ENTRYPOINT 的 Exec 格式用于设置要执行的命令及其参数,同时可通过 CMD 提供额外的参数。
ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。 - Shell:ENTRYPOINT
comman
# Dockerfile ENTRYPOINT echo "ENTRYPOINT shell" 运行 镜像输出 ENTRYPOINT shell ################# [root@localhost ~]# docker run centos:v6 "cmd" ENTRYPOINT shell
ENTRYPOINT 的 Shell 格式会忽略任何 CMD 或 docker run 提供的参数