Dockerfile 编写技巧和知识汇总

2025-06-27 19:36:00
丁国栋
原创 228
摘要:本文记录一些关于Dockerfile 编写技巧和知识汇总。

参考:https://docs.docker.com/reference/dockerfile/


技巧1:复制本地文件到Docker镜像时指定权限或用户(组):


FROM hub.thedf.cc/web/zsite:v9.0-main-1daebed
ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8
COPY --chown=33:33 . /

技巧2:构建并推送时禁用缓存

有时我们只是改动了本地的文件,而没有改动Dockerfile,docker build时可能会使用缓存,这样我们在本地改动的文件就无法更新到镜像中,这时我们需要在构建镜像时使用参数 --no-cache 禁用缓存(严格说也是docker build的bug)。


docker build --no-cache --push -t hub.thedf.cc/web/zsite:v9.0-main-1daebed -f Dockerfile .

技巧3:设计 Entrypoint

我们在设计编写 Entrypoint 脚本或者二进制文件时,需要考虑到运行 /bin/bash 的情况。因此可以在 Entrypoint 中做判断,如果参数是bash或者/bin/bash 就通过 exec 执行它。

下面是一个shell脚本的例子。


if [ "${1:-}"  == "bash" ]; then
    shift 1
    exec /bin/bash "$@"
else
    pass
fi


技巧4:精简基于 debian 镜像


FROM php:7.4.33-apache
ENV DEBIAN_FRONTEND=noninteractive
RUN sed -i -r 's/(deb|security).debian.org/mirrors.tuna.tsinghua.edu.cn/g; s/https/http/g' /etc/apt/sources.list \
    && apt update -qq && apt-get install -y --no-install-recommends vim \
    && rm -r /var/lib/apt/lists /var/cache/apt/archives
COPY . /
RUN docker-php-ext-install pdo_mysql && a2enmod rewrite
在本例中,使用环境变量 DEBIAN_FRONTEND 来控制非交互使用场景无需用户输入;替换默认的软件源地址为清华大学tuna;以安装vim为例演示如何安装一个软件包和后续处理。

技巧5:构建时启用跟踪、输出详细信息

为了debug,我们在执行bash命令时会使用 set -eux; 指令,但使用 docker build 构建出错时又不输出执行结果,此时可以这样做:


# 禁用 BuildKit
DOCKER_BUILDKIT=0 docker build -t myimage .
# 或者使用传统输出
docker build --progress=plain -t myimage .

这在一些CI/CD场景中也可以使用,便于排查问题。


技巧6:Dockerfile中的RUN指令将多行文本输出到文件

FROM debian:trixie-slim
RUN { set -eux; \
        echo 'Types: deb'; \
        echo '# http://snapshot.debian.org/archive/debian/20251117T000000Z'; \
        echo 'URIs: http://mirrors.tencent.com/debian'; \
        echo 'Suites: trixie trixie-updates'; \
        echo 'Components: main'; \
        echo 'Signed-By: /usr/share/keyrings/debian-archive-keyring.pgp'; \
        echo ''; \
        echo 'Types: deb'; \
        echo '# http://snapshot.debian.org/archive/debian-security/20251117T000000Z'; \
        echo 'URIs: http://mirrors.tencent.com/debian-security'; \
        echo 'Suites: trixie-security'; \
        echo 'Components: main'; \
        echo 'Signed-By: /usr/share/keyrings/debian-archive-keyring.pgp'; \
        } | tee /etc/apt/sources.list.d/debian.sources; \
        apt-get -o Acquire::https::Verify-Peer=false update; \
        apt-get -o Acquire::https::Verify-Peer=false install -y ca-certificates;\
        rm -rf /var/lib/apt/lists/*;
其中大括号后也支持重定向指令。

--

发表评论
博客分类