Dockerfile常见指令优化
一、指令格式化
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/*
- 使用Alipine镜像中APK命令安装包时记得加上
七、使用合理的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
参考
- https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
- https://www.artindustrial-it.com/2017/09/20/10-best-practices-for-creating-good-docker-images/
- https://gist.github.com/StevenACoffman/41fee08e8782b411a4a26b9700ad7af5
- https://snyk.io/blog/10-docker-image-security-best-practices/
- 原文出处:https://gitbook.curiouser.top/origin/dockerfile-optimization.html#
Dockerfile常见指令优化相关推荐
- 亿级PV,常见性能优化策略总结与真实案例
作者:晓明 来自:美团技术团队 0 题记 美团网是国内最大的O2O服务平台,虽然经常面临高并发.大流量等问题,但在用户体验优化上美团APP仍被众多IT同行所推崇,他们在性能优化方面积累的宝贵经验尤其值 ...
- OpenCV常见的优化方法和技巧总结
OpenCV常见的优化方法和技巧总结 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/78540206 目录 OpenCV常 ...
- java常见性能优化_十大最常见的Java性能问题
java常见性能优化 Java性能是所有Java应用程序开发人员都关心的问题,因为快速使应用程序与使其正常运行同等重要. 史蒂文·海恩斯(Steven Haines)使用他在Java性能问题上的个人经 ...
- 企业网站6个常见的优化漏洞
导读:企业做营销网站目的,就是希望通过网络营销,挖掘目标客户.目标客户怎么来,那就需要通过网站优化,把网站关键词优化排名到首页,这样才能更多的机会被潜在客户点击.很多企业网站上线之前,没有处理好优化细 ...
- Git常见指令的本质
本文来说下Git常见指令的本质 文章目录 基本概念 基本概念
- 【重难点】【Java基础 07】变量类型、内部类、处理器指令优化
[重难点][Java基础 07]变量类型.内部类.处理器指令优化 文章目录 [重难点][Java基础 07]变量类型.内部类.处理器指令优化 一.变量类型 1.对比 二.内部类 1.介绍 三.处理器指 ...
- Nginx 是如何实现高并发?常见的优化手段有哪些?
点击关注公众号,实用技术文章及时了解 来源:toutiao.com/i6698255904053133827 这是一位读者带回来的面试题 Nginx 是如何实现并发的?为什么 Nginx 不使用多线程 ...
- mysql 优化关键字_Mysql之Explain关键字及常见的优化手段
Explain关键字字段描述: Explain关键字字段详情描述 id 我们写的查询语句一般都以SELECT关键字开头,比较简单的查询语句里只有一个SELECT关键字,但是下边两种情况下在一条查询语句 ...
- webpack之常见性能优化
webpack之常见性能优化 构建性能 减少模块解析 优化loader性能 限制loader的应用 缓存loader的结果 多线程打包 开启热替换 常见loader和plugin 传输性能 分包 手动 ...
最新文章
- STM32的RTC简单操作
- Bitcoin0.21版 公链开发(4) Apache windows上安装
- matlab优化工具箱
- 一文攻破枚举类型-C语言
- P3825 [NOI2017]游戏
- CSS3的transition和transform
- python入门之玩转列表我的菜单_我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)...
- jprofiler安装与使用
- 02.规划过程组表格-需求跟踪矩阵
- pcm系统设计及matlab仿真实现,DOC:25页毕业设计PCM系统设计及MATLAB仿真实现.doc文档优秀范文...
- 企业微信--扫一扫功能(隐形坑)
- Access denied for user ‘‘@‘localhost‘ (using password: YES)报错原因分享
- 走吧走吧,拿着更多的票子把活干吧!
- win7万能声卡驱动_驱动精灵万能网卡版下载-驱动精灵万能网卡版免费下载
- cblas_sgemm和cublasSgemm参数详解
- Elastic Stack 开源的大数据解决方案
- 南非银行“内鬼”偷走主密钥,后将更换1200万张客户卡,损失惨重
- 闪马智能创始人兼CEO彭垚入选2021年度张江杰出人才拟表彰名单
- 制作单词记录App(一)
- 【论文解读--力控电机+四足机器人载体设计】(Cheetah mini)A Low Cost Modular Actuator for Dynamic Robots
热门文章
- 个人开发者 android内购,【开发者账号】关于内购,协议税务的一些坑
- 大学c语言第三章作业,华中科技大学光电子学院C语言第三章
- pytorch随笔-6
- tensorflow随笔-不动点迭代求一元方程
- mxnet基础到提高(15)--梯度与反向传播
- 【Python】Pandas/Sklearn进行机器学习之特征筛选,有效提升模型性能
- 【图网络】如何用Python实现算法:规划图技术(GraphPlanner)
- AI基础:提供pdf打包下载了!(更新了25集)
- 聚类 | 超详细的性能度量和相似度方法总结
- 用代码,打造创意新世界!【Innovation 2021】网易应用创新开发者大赛正式开赛!