Dockerfile常见指令优化
生活随笔
收集整理的這篇文章主要介紹了
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/binRUN
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命令裝最小化需求的軟件包
四、盡量不使用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/timezone2、設置系統語言
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-i18n3、使用Label標注作者、軟件版本等元信息
FROM alpine:3.11.5 LABEL Author=Curiouser \Mail=****@163.com \PHP=7.3 \Tools=“git、vim、curl” \Update="添加用戶組"4、指定工作區
WORKDIR /var/wwww5、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://gitbook.curiouser.top/origin/dockerfile-optimization.html#
總結
以上是生活随笔為你收集整理的Dockerfile常见指令优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: K8S教程:使用kubebuilder开
- 下一篇: Python+Django+Ansibl