1、ADD和COPY的区别
- 相同点
- 构建镜像是传送文件到镜像
<font style="color:#F5222D;">COPY</font>/ADD <src> ... <dest>
- 不同点
- ADD功能强大
- 支持自动解压(不一定完全可靠)
- 支持url作为
参数传递(此时不支持解压)
- COPY功能单一
- 不支持解压
- 不支持url
- ADD功能强大
注:可以看出COPY是一个简化版的ADD,只负责文件的传输(**推荐使用COPY**)
存在curl的可以在<font style="background-color:#FADB14;">RUN</font>
指令中使用curl进行下载并使用管道符传给<font style="background-color:#FADB14;">tar</font>
命令进行解压后删除源码包文件(减少了一层镜像)
使用ADD的情况:除非明确要使用ADD!
2、CMD和ENTRYPOINT的区别
- ENTRYPOINT和CMD都是让用户指定一个可执行程序, 这个可执行程序在container启动后自动启动
- docker运行容器时可以覆盖两个指令
- ENTRYPOINT 覆盖使用
<font style="color:rgb(18, 18, 18);">--entrypoint</font>
参数指定命令<font style="color:#F5222D;">docker run [--entrypoint 命令] <image></font>
- CMD 覆盖时直接后面接需要运行的命令<font style="color:#F5222D;">docker run <image> [命令]</font>
- 建议使用ENTRYPOINT - 两个都支持Shell和Exec强烈建议使用Exec
- Shell写法:
CMD executable param1 param2
- Exec写法:CMD [“executable”,“param1”,“param2”] —>使用json格式
- shell格式的缺点
- shell作为1号进程
- 外部发送的POSIX信号不会转发给实际运行的进程
- 无法安全关闭容器
- Shell写法:
总结:
- CMD和ENTRYPOINT,__建议使用ENTRYPOINT
- 格式建议使用Exec,即(CMD/ENTRYPOINT [“executable”,”param1”,”param2”])
组合使用,更强大
- ENTRYPOINT指定默认的运行命令
- CMD指定默认的运行参数
注意:**Kubemetes 中定义容器时 镜像的 ENTRYPOINT 和 CMD 均可以被覆盖(command、args)**
- 绝大多数情况下, 只需要设置自定义参数。 命令一般很少被覆盖, 除非针对一 些未定义 ENTRYPOINT 的通用镜像, 例如 busybox。
- command 和 args 字段在 pod 创建后无法被修改