K8S|Dockerfile最佳实践

K8S负责维护容器状态,容器来自于镜像,此篇就是生成镜像的最佳实践.虽然比较基础,但是满满的干货的诚意.

Dockerfile指令介绍

  • FROM
  • MAINTAINER(作者信息,老版本,抛弃)
  • LABEL(添加标签,键值对)
LABEL version="1.0"
LABEL description="test"

我们可以给镜像添加多个 LABEL
注意:
1. 每条 LABEL 指令都会生成一个新的层。所以最好是把添加的多个 LABEL 合并为一条命令:
LABEL multi.label1="value1" multi.label2="value2" other="value3"
2. 如果新添加的 LABEL 和已有的 LABEL 同名,则新值会覆盖掉旧值。

我们可以使用 docker inspect 命令查看镜像的 LABEL 信息
  • RUN
    RUN command
RUN echo hello
RUN ["echo","hello"]
  • EXPOSE
    EXPOSE 80/tcp
告诉 Docker 服务,容器需要暴露的端口号
docker run -P(Publish all exposed ports to random ports)
docker run -p 18080:8080 
  • ENV
    格式为 ENV 指定一个环境变量,并在容器运行时保持
  • ADD 与 COPY
格式为 ADD/COPY <src>  <dest>
区别:
ADD可以是Dockerfile所在目录的一个相对路径;也可以是一个URL;还可以是一个tar文件(自动解压为目录)
COPY本地主机的(为Dockerfile所在目录的相对路径,文件或目录) 

建议: 优先使用COPY,比ADD更简单明了
ADD 命令功能相对 COPY 更复杂,包含从internet下载,解压等
不推荐使用 ADD 命令从远程下载一个软件包解压到镜像内
推荐使用curl/wget下载到本地,然后再解压到镜像内,并将原始文件删除
  • WORKDIR
    格式为 WORKDIR /path/to/workdir
    为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录
  • USER
    设置启动容器的用户,可以是用户名或UID
USER meiqia
USER 1002

注意:如果设置了容器以某用去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行,
使用这个指令一定要确认容器中拥有这个用户,并且拥有足够权限
  • CMD 与 ENTRYPOINT
    • shell形式
      command
    • exec形式
      ["executa ble", "parameter"]
例子:
CMD echo “Hello World” (shell格式)
CMD [“echo”, “Hello World”] (exec格式 )
ENTRYPOINT echo “Hello World” (shell格 式)
ENTRYPOINT [“echo”, “Hello World”] (exec格式 )

FROM busybox
ENTRYPOINT ["echo","hello"]
CMD ["echo"]

尽量都采用 exec 形式,防止有潜在问题

  • Tips

    • 缓存
      在开发周期中,构建Docker映像,更改代码或步骤然后重新构建时,利用缓存很重要。缓存有助于避免在不
      需要时再次运行构建步骤

      • 构建顺序
        从最少到最频繁更改的步骤对您的步骤进行排序,以优化缓存
      • 确定可缓存单元,例如安装包和更新
        每个RUN指令都可以看作是可缓存的执行单元。它们过多可能是不必要的,从程序包管理器安装程序包时,始终希望更新索引并以相同的RUN模式安装程序包:它们一起形成一个可缓存单元
    • 缩小 image size

      • 删除不必要的依赖包
      • 删除软件包管理器缓存
      • 删除源码安装包
    • 高维护性

      • 尽量采用官方image,已有应用减少自己构建
        生式image可以节省大量维护时间,因为所有安装步骤都已完成,并且采用了最佳实践
      • 使用更具体的标签,避免不同版本差异
    • 依赖性
      多阶段构建

参考链接
https://blog.csdn.net/atlansi/article/details/87892016
https://www.docker.com/blog/intro-guide-to-dockerfile-best-practices/

转载请注明: 转自Rainbird的个人博客
   本文链接: K8S|Dockerfile最佳实践


相关博文

About rainbird

IOS攻城狮
This entry was posted in K8S and tagged , , , , , , , , , , , . Bookmark the permalink.

发表评论