Cloud Native 16 min read

Boost Your Docker Images: Proven Tips to Shrink Size and Speed Up Builds

Learn practical Dockerfile optimization techniques—including clean build contexts, selecting minimal base images, configuring domestic package mirrors, setting correct timezones, using virtual build environments, minimizing image layers, and consolidating file additions—to dramatically reduce image size, improve build speed, and avoid common pitfalls.

Efficient Ops
Efficient Ops
Efficient Ops
Boost Your Docker Images: Proven Tips to Shrink Size and Speed Up Builds

Building Image Tips

Build Context

When you run docker build, the current working directory is the build context. Docker sends all files in this directory to the daemon. You can use -f to specify a Dockerfile, but keep the context clean; avoid creating a Dockerfile and immediately running docker build in the same directory.

mkdir project
cd project
vi Dockerfile
# write Dockerfile
You can also use a .dockerignore file to exclude unnecessary files from the build context.

Base Image

Prefer small base images such as alpine or debian:buster-slim. For Java, use openjdk:xxx-slim, which is based on a slim Debian image. Note that Alpine uses musl libc instead of glibc, so large projects that depend on glibc (e.g., OpenJDK, Tomcat, RabbitMQ) may encounter issues and are not recommended on Alpine.

REPOSITORY   TAG          IMAGE ID       CREATED        SIZE
debian       buster-slim  e1af56d072b8   4 days ago     69.2MB
alpine       latest       cc0abc535e36   8 days ago     5.59MB

Domestic Software Sources

Replace default package mirrors with domestic mirrors (Huawei Cloud, Alibaba Cloud, Tencent Cloud, 163.com) for faster downloads. Example commands:

Alpine

echo "http://mirrors.huaweicloud.com/alpine/latest-stable/main/" > /etc/apk/repositories
echo "http://mirrors.huaweicloud.com/alpine/latest-stable/community/" >> /etc/apk/repositories
apk update

Debian

sed -i 's/deb.debian.org/mirrors.huaweicloud.com/g' /etc/apt/sources.list
sed -i 's|security.debian.org/debian-security|mirrors.huaweicloud.com/debian-security|g' /etc/apt/sources.list
apt update

Ubuntu

sed -i 's/archive.ubuntu.com/mirrors.huaweicloud.com/g' /etc/apt/sources.list
apt update

Timezone Settings

Most base images default to UTC, which differs from Beijing time by 8 hours. Set the container timezone with the environment variable -e TZ=Asia/Shanghai or by installing tzdata and copying the zoneinfo file.

Alpine

docker run --rm -it -e TZ=Asia/Shanghai alpine date
# or in Dockerfile
RUN apk add --no-cache tzdata && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    apk del tzdata

Debian

docker run --rm -it -e TZ=Asia/Shanghai debian date
# or copy timezone files in Dockerfile
COPY /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone

Ubuntu

docker run --rm -it -e TZ=Asia/Shanghai ubuntu date
A handy trick: use the caret ( ^ ) to replace the previous command's image name (e.g., replace debian with ubuntu ).

Use URL to Add Source

When building projects that need source compilation, prefer git or wget to fetch source inside the image, then delete the source in the same RUN line to avoid leaving it in a layer.

Original FastDFS Dockerfile (simplified):

# centos 7
FROM centos:7
ADD conf/client.conf /etc/fdfs/
ADD conf/http.conf /etc/fdfs/
ADD conf/mime.types /etc/fdfs/
ADD conf/storage.conf /etc/fdfs/
ADD conf/tracker.conf /etc/fdfs/
ADD fastdfs.sh /home
ADD conf/nginx.conf /etc/fdfs/
ADD conf/mod_fastdfs.conf /etc/fdfs
ADD source/libfastcommon.tar.gz /usr/local/src/
ADD source/fastdfs.tar.gz /usr/local/src/
ADD source/fastdfs-nginx-module.tar.gz /usr/local/src/
ADD source/nginx-1.15.4.tar.gz /usr/local/src/
RUN yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y && \
    mkdir /home/dfs && \
    cd /usr/local/src && \
    ... (build steps) ...
EXPOSE 22122 23000 8888 80
ENTRYPOINT ["/home/fastdfs.sh"]

Optimized Dockerfile:

FROM alpine:3.10
RUN set -x \
    && echo "http://mirrors.huaweicloud.com/alpine/latest-stable/main/" > /etc/apk/repositories \
    && echo "http://mirrors.huaweicloud.com/alpine/latest-stable/community/" >> /etc/apk/repositories \
    && apk update \
    && apk add --no-cache --virtual .build-deps gcc libc-dev make perl-dev openssl-dev pcre-dev zlib-dev git \
    && mkdir -p /usr/local/src \
    && cd /usr/local/src \
    && git clone https://github.com/happyfish100/libfastcommon.git --depth 1 \
    && git clone https://github.com/happyfish100/fastdfs.git --depth 1 \
    && git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1 \
    && wget http://nginx.org/download/nginx-1.15.4.tar.gz \
    && tar -xf nginx-1.15.4.tar.gz \
    && cd libfastcommon && ./make.sh && ./make.sh install \
    && cd ../fastdfs && ./make.sh && ./make.sh install \
    && cd ../nginx-1.15.4 && ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/ && make && make install \
    && apk del .build-deps && apk add --no-cache pcre-dev bash \
    && mv /usr/local/src/fastdfs/docker/dockerfile_network/fastdfs.sh /home \
    && mv /usr/local/src/fastdfs/docker/dockerfile_network/conf/* /etc/fdfs \
    && chmod +x /home/fastdfs.sh \
    && rm -rf /usr/local/src*
VOLUME /home/dfs
EXPOSE 22122 23000 8888 8080
CMD ["/home/fastdfs.sh"]

Result: the original image size (~500 MB) is reduced to ~30 MB after optimization.

Minimize Layers

Since Docker 1.10 only RUN, COPY, and ADD create layers. Combine multiple commands with && or ; into a single RUN to keep the layer count low. For many files, pack them into a single tarball and extract in one step:

FROM alpine:3.10
COPY src.tar.gz /usr/local/src.tar.gz
RUN set -xe \
    && apk add --no-cache --virtual .build-deps gcc libc-dev make perl-dev openssl-dev pcre-dev zlib-dev tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && tar -xvf /usr/local/src.tar.gz -C /usr/local \
    && mv /usr/local/src/conf/fastdfs.sh /home/fastdfs/ \
    && mv /usr/local/src/conf/* /etc/fdfs \
    && chmod +x /home/fastdfs/fastdfs.sh \
    && rm -rf /usr/local/src/* /var/cache/apk/* /tmp/* $HOME/.cache
VOLUME /var/fdfs

Other layer‑reduction tricks include chaining commands with && or ;; the latter is often seen in official Dockerfiles.

Source: https://blog.k8s.li/dockerfile-tips.html (article slightly trimmed).

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

Dockerimage-optimizationContainerDockerfileBuild Tips
Efficient Ops
Written by

Efficient Ops

This public account is maintained by Xiaotianguo and friends, regularly publishing widely-read original technical articles. We focus on operations transformation and accompany you throughout your operations career, growing together happily.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.