一、指令格式化

LABEL

LABEL vendor=ACME\ Incorporated \com.example.is-beta= \com.example.is-production="" \com.example.version="0.0.1-beta" \com.example.release-date="2015-02-12"

ENV

Dockerfile中ENV指令像RUN指令一样,每一个都会创建一个临时层。

ENV JAVA_HOME=/opt/jdk1.8.0_241 \CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=$PATH:$JAVA_HOME/bin

RUN

RUN apt-get update && \apt-get install -y --no-install-recommends \apt-transport-https \ca-certificates && \rm -rf /var/lib/apt/lists/*

二、指令优化

1、减少RUN指令,合并命令

RUN useradd -s /sbin/nologin -m -u 1001 curiouser && \mkdir -p /home/curiouser/{data,logs} && \rm -rf /etc/yum.repos.d/C* && \yum install -q -y git && \yum clean all && \curl -s http://192.168.1.7/repository/tools/jdk-8u241-linux-x64.tar.gz | tar -xC /opt/

2、使用COPY来代替ADD

对于使用ADD指令下载远程服务器上的tar包并解压,建议使用以下方式代替

RUN curl -s http://192.168.1.7/repository/tools/jdk-8u241-linux-x64.tar.gz | tar -xC /opt/

三、最小化基础镜像,减小镜像体积

1、尽量使用Alpine作为基础镜像

  • Alpine镜像大小最多才几MB。
  • 使用APK命令装最小化需求的软件包
FROM alpine:3.11.5
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \&& apk add --no-cache git

四、尽量不使用root用户

在做基础运行时镜像时,创建运行时普通用户和用户组,并做工作区与权限限制,启动服务时尽量使用普通用户。

gosu

FROM alpine:3.11.5
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \&& apk add --no-cache gosu

参考:

https://blog.csdn.net/boling_cavalry/article/details/93380447

五、使用进程管理工具来处理进程信号

为防止容器中的进程变成僵尸进程,

dumb-init

Github地址:https://github.com/Yelp/dumb-init

FROM alpine:3.11.5
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \&& apk add --no-cache dumb-init# Runs "/usr/bin/dumb-init -- /my/script --with --args"
ENTRYPOINT ["dumb-init", "--"]# or if you use --rewrite or other cli flags
# ENTRYPOINT ["dumb-init", "--rewrite", "2:3", "--"]CMD ["/my/script", "--with", "--args"]

参考:

https://www.infoq.cn/article/2016/01/dumb-init-Docker

https://www.cnblogs.com/sunsky303/p/11046681.html

六、移除所有缓存等不必要信息

  • 删除解压后的源压缩包(参考第二章第二节)

  • 清理包管理器下载安装软件时的缓存

    • 使用Alipine镜像中APK命令安装包时记得加上--no-cache
    • 使用Ubuntu镜像中的APT命令安装软件后记得rm -rf /var/lib/apt/lists/*

七、使用合理的ENTRYPOINT脚本

示例:

#!/bin/bash
set -eif [ "$1" = 'postgres' ]; thenchown -R postgres "$PGDATA"if [ -z "$(ls -A "$PGDATA")" ]; thengosu postgres initdbfiexec gosu postgres "$@"
fiexec"$@"

八、其他建议

1、设置时区

FROM alpine:3.11.5
ENV TZ=Asia/Shanghai
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \&& apk add --no-cache tzdata \&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo "Asia/Shanghai" > /etc/timezone

2、设置系统语言

FROM alpine:3.11.5
ENV LANG=en_US.UTF-8 \LANGUAGE=en_US.UTF-8RUN apk --no-cache add ca-certificates \ && wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \ && wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk \ && wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-bin-2.29-r0.apk \&& wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-i18n-2.29-r0.apk \&& apk add glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk \&& rm -rf /usr/lib/jvm glibc-2.29-r0.apk glibc-bin-2.29-r0.apk  glibc-i18n-2.29-r0.apk \&& /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true \&& echo "export LANG=$LANG" > /etc/profile.d/locale.sh \&& apk del glibc-i18n

3、使用Label标注作者、软件版本等元信息

FROM alpine:3.11.5
LABEL Author=Curiouser \Mail=****@163.com \PHP=7.3 \Tools=“git、vim、curl” \Update="添加用户组"

4、指定工作区

WORKDIR /var/wwww

5、RUN指令显示优化

RUN set -eux ; \ls -al

九、镜像构建

1、命名

原则是见名知意。可使用三段式

镜像仓库地址/类型库/镜像名:版本号

  • registry/runtime/Java:8.1.2
  • registry/runtime/php-fpm-nginx:7.3-1.14
  • registry/cicd/kubctl-helm:1.17-3.0
  • registry/cicd/git-compose-docker:v1
  • registry/applications/demo:git_commit_id

2、使用Makefile

IMAGE_BASE = registry/runtime
IMAGE_NAME = php-fpm
IMAGE_VERSION = 7.3
all: build push
build:docker build --rm -f Dockerfile -t ${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION} .
push:docker push ${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION}
# 构建并推送
make
# 仅构建
make build
# 仅推送
make push

参考

  1. https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
  2. https://www.artindustrial-it.com/2017/09/20/10-best-practices-for-creating-good-docker-images/
  3. https://gist.github.com/StevenACoffman/41fee08e8782b411a4a26b9700ad7af5
  4. https://snyk.io/blog/10-docker-image-security-best-practices/
  • 原文出处:https://gitbook.curiouser.top/origin/dockerfile-optimization.html#

Dockerfile常见指令优化相关推荐

  1. 亿级PV,常见性能优化策略总结与真实案例

    作者:晓明 来自:美团技术团队 0 题记 美团网是国内最大的O2O服务平台,虽然经常面临高并发.大流量等问题,但在用户体验优化上美团APP仍被众多IT同行所推崇,他们在性能优化方面积累的宝贵经验尤其值 ...

  2. OpenCV常见的优化方法和技巧总结

    OpenCV常见的优化方法和技巧总结 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/78540206 目录 OpenCV常 ...

  3. java常见性能优化_十大最常见的Java性能问题

    java常见性能优化 Java性能是所有Java应用程序开发人员都关心的问题,因为快速使应用程序与使其正常运行同等重要. 史蒂文·海恩斯(Steven Haines)使用他在Java性能问题上的个人经 ...

  4. 企业网站6个常见的优化漏洞

    导读:企业做营销网站目的,就是希望通过网络营销,挖掘目标客户.目标客户怎么来,那就需要通过网站优化,把网站关键词优化排名到首页,这样才能更多的机会被潜在客户点击.很多企业网站上线之前,没有处理好优化细 ...

  5. Git常见指令的本质

    本文来说下Git常见指令的本质 文章目录 基本概念 基本概念

  6. 【重难点】【Java基础 07】变量类型、内部类、处理器指令优化

    [重难点][Java基础 07]变量类型.内部类.处理器指令优化 文章目录 [重难点][Java基础 07]变量类型.内部类.处理器指令优化 一.变量类型 1.对比 二.内部类 1.介绍 三.处理器指 ...

  7. Nginx 是如何实现高并发?常见的优化手段有哪些?

    点击关注公众号,实用技术文章及时了解 来源:toutiao.com/i6698255904053133827 这是一位读者带回来的面试题 Nginx 是如何实现并发的?为什么 Nginx 不使用多线程 ...

  8. mysql 优化关键字_Mysql之Explain关键字及常见的优化手段

    Explain关键字字段描述: Explain关键字字段详情描述 id 我们写的查询语句一般都以SELECT关键字开头,比较简单的查询语句里只有一个SELECT关键字,但是下边两种情况下在一条查询语句 ...

  9. webpack之常见性能优化

    webpack之常见性能优化 构建性能 减少模块解析 优化loader性能 限制loader的应用 缓存loader的结果 多线程打包 开启热替换 常见loader和plugin 传输性能 分包 手动 ...

最新文章

  1. STM32的RTC简单操作
  2. Bitcoin0.21版 公链开发(4) Apache windows上安装
  3. matlab优化工具箱
  4. 一文攻破枚举类型-C语言
  5. P3825 [NOI2017]游戏
  6. CSS3的transition和transform
  7. python入门之玩转列表我的菜单_我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)...
  8. jprofiler安装与使用
  9. 02.规划过程组表格-需求跟踪矩阵
  10. pcm系统设计及matlab仿真实现,DOC:25页毕业设计PCM系统设计及MATLAB仿真实现.doc文档优秀范文...
  11. 企业微信--扫一扫功能(隐形坑)
  12. Access denied for user ‘‘@‘localhost‘ (using password: YES)报错原因分享
  13. 走吧走吧,拿着更多的票子把活干吧!
  14. win7万能声卡驱动_驱动精灵万能网卡版下载-驱动精灵万能网卡版免费下载
  15. cblas_sgemm和cublasSgemm参数详解
  16. Elastic Stack 开源的大数据解决方案
  17. 南非银行“内鬼”偷走主密钥,后将更换1200万张客户卡,损失惨重
  18. 闪马智能创始人兼CEO彭垚入选2021年度张江杰出人才拟表彰名单
  19. 制作单词记录App(一)
  20. 【论文解读--力控电机+四足机器人载体设计】(Cheetah mini)A Low Cost Modular Actuator for Dynamic Robots

热门文章

  1. 个人开发者 android内购,【开发者账号】关于内购,协议税务的一些坑
  2. 大学c语言第三章作业,华中科技大学光电子学院C语言第三章
  3. pytorch随笔-6
  4. tensorflow随笔-不动点迭代求一元方程
  5. mxnet基础到提高(15)--梯度与反向传播
  6. 【Python】Pandas/Sklearn进行机器学习之特征筛选,有效提升模型性能
  7. 【图网络】如何用Python实现算法:规划图技术(GraphPlanner)
  8. AI基础:提供pdf打包下载了!(更新了25集)
  9. 聚类 | 超详细的性能度量和相似度方法总结
  10. 用代码,打造创意新世界!【Innovation 2021】网易应用创新开发者大赛正式开赛!