1、ADD和COPY的区别

  • 相同点
    • 构建镜像是传送文件到镜像
    • <font style="color:#F5222D;">COPY</font>/ADD <src> ... <dest>
  • 不同点
    • ADD功能强大
      • 支持自动解压(不一定完全可靠)
      • 支持url作为参数传递(此时不支持解压)
    • COPY功能单一
      • 不支持解压
      • 不支持url

注:可以看出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信号不会转发给实际运行的进程
      • 无法安全关闭容器

总结:

  • CMD和ENTRYPOINT,__建议使用ENTRYPOINT
  • 格式建议使用Exec,即(CMD/ENTRYPOINT [“executable”,”param1”,”param2”])

组合使用,更强大

  • ENTRYPOINT指定默认的运行命令
  • CMD指定默认的运行参数

注意:**Kubemetes 中定义容器时 镜像的 ENTRYPOINT 和 CMD 均可以被覆盖(command、args)**

  • 绝大多数情况下, 只需要设置自定义参数。 命令一般很少被覆盖, 除非针对一 些未定义 ENTRYPOINT 的通用镜像, 例如 busybox。
  • command 和 args 字段在 pod 创建后无法被修改

Dockerfile指令 - 图1