前言
- 本篇来学习下Dockerfile中的CMD/ENTRYPOINT指令
CMD
作用
- 启动容器时默认执行的命令
说明:
- 一个 Dockerfile 只有一个 CMD 指令,只有最后一个 CMD 指令生效
- 使用 docker run -d xxx CMD 命令是可以覆盖 Dockerfile 中的 CMD 指令的
格式
# exec 方式, 首选方式 CMD ["可执行命令", "参数1", "参数2"...] CMD ["executable","param1","param2"] # 为 ENTRYPOINT 提供默认参数 CMD ["param1","param2"] # shell 形式 CMD 命令 参数1 参数2 CMD command param1 param2
使用示例
- 新建dockerfile
FROM ubuntu # CMD 和 ENTRYPOINT 作为唯一入口,写多个,只有最后一个生效 # shell方式 CMD ping bing.com # exec方式 CMD [ "sh", "-c", "echo $HOME" ]
- 制作镜像
docker build -t test --force-rm --no-cache .
- 运行容器
# --rm 表示容器退出,自动删除 docker run -it --rm test
- 可以看到只执行了后面的echo $HOME,没执行ping 命令
ENTRYPOINT
作用
- 指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有其他传入值作为该命令的参数
说明:
- 一个 Dockerfile 只有一个 ENTRYPOINT 指令,只有最后一个 ENTRYPOINT 指令生效
格式
# exec 格式 ENTRYPOINT ["executable", "param1", "param2"] # shell 格式 ENTRYPOINT command param1 param2
使用示例
- 新建dockerfile
FROM ubuntu # CMD 和 ENTRYPOINT 作为唯一入口,写多个,只有最后一个生效 # shell方式 ENTRYPOINT ping baidu.com # exec方式 ENTRYPOINT [ "sh", "-c", "echo $HOME" ]
- 制作镜像
docker build -t test --force-rm --no-cache .
- 运行容器
docker run -it --rm test
CMD/ENTRYPOINT区别
- CMD :指定这个容器启动的时候要运行的命令,会覆盖原命令,不可以追加命令
- ENTRYPOINT :指定这个容器启动的时候要运行的命令,可以追加命令
CMD使用示例
- dockerfile
FROM ubuntu CMD ["ls","-a"]
- 制作镜像
docker build -t test --force-rm --no-cache .
- 运行容器
# 覆盖 ls -a; -l命令是不存在的,所以会报错 docker run -it --rm test -l
ENTRYPOINT使用示例
- dockerfile
FROM ubuntu ENTRYPOINT ["ls","-a"]
- 制作镜像
docker build -t test --force-rm --no-cache .
- 运行容器
# 会追加命令 相当于执行 ls -a -l docker run -it --rm test -l