尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Docker Mailserver 自建镜像构建指南:子模块获取、构建参数与多阶段构建详解

Docker Mailserver 自建镜像构建指南:子模块获取、构建参数与多阶段构建详解 Docker Mailserver 自建镜像构建指南子模块获取、构建参数与多阶段构建详解【免费下载链接】docker-mailserverProduction-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container.项目地址: https://gitcode.com/gh_mirrors/do/docker-mailserver本指南面向希望基于 docker-mailserver 仓库自行构建 Docker 镜像的开发者与运维人员。你将掌握从获取仓库子模块、执行docker build、配置三个核心构建参数DOVECOT_COMMUNITY_REPO、DMS_RELEASE、VCS_REVISION到理解构建参数如何影响运行时更新检查与镜像元数据标签的完整链路。文中所有结论均以当前仓库的 Dockerfile、.gitmodules 与 docs/content/examples/tutorials/docker-build.md 为事实依据。构建前的准备获取 Git 子模块docker-mailserver 仓库依赖若干 Git 子模块submodule主要服务于测试体系。当前仓库的 .gitmodules 声明了以下三个子模块test/batsBATSBash Automated Testing System核心来源bats-core/bats-coretest/test_helper/bats-supportBATS 测试辅助库test/test_helper/bats-assertBATS 断言辅助库这些子模块位于test/目录下test/bats、test/test_helper/bats-support、test/test_helper/bats-assert。因此在构建镜像之前必须先把它们拉取到本地否则docker build所需的构建上下文可能不完整。在你本地仓库副本中执行以下命令一次性完成子模块拉取并构建镜像git submodule update --init --recursive docker build --tag YOUR CUSTOM IMAGE NAME .其中YOUR CUSTOM IMAGE NAME需替换为你自己的镜像名与标签例如mailserver/mine:latest。如果你还没有克隆仓库也可以在克隆的同时递归获取子模块一步到位git clone --recurse-submodules 仓库克隆地址提示若仓库地址中包含--recurse-submodules则克隆完成后无需再执行git submodule update --init --recursive可直接进入构建环节。开始构建基础命令与构建上下文子模块就绪后即可在仓库根目录即 Dockerfile 所在目录执行docker build --tag YOUR CUSTOM IMAGE NAME .这里的.表示以当前目录为构建上下文。需要注意仓库根目录存在 .dockerignore其内容为* !target这意味着发送给 Docker 守护进程的构建上下文只包含target目录构建所需脚本、配置的源文件均存放于 target 下从而大幅减少上下文体积、加快构建。构建过程中Dockerfile 通过COPY target/...指令将这些文件复制进镜像例如COPY target/dovecot/*.inc target/dovecot/*.conf /etc/dovecot/conf.d/、COPY target/postfix/main.cf target/postfix/master.cf /etc/postfix/等。如果你更习惯用 Make 工作流仓库根目录的 Makefile 也提供了等价目标make build其内部执行的正是docker build --tag $(IMAGE_NAME) .默认镜像名为mailserver-testing:ci可通过变量覆盖。Docker 版本要求与 BuildKit构建过程使用了一些较新的镜像构建特性因此对 Docker 版本有最低要求建议使用 Docker v23.0 或更新版本更早的版本可能也能工作但不保证。如果你使用的是v23.0 之前的 Docker需要显式启用 BuildKitexport DOCKER_BUILDKIT1 docker build --tag YOUR CUSTOM IMAGE NAME .BuildKit 是 Docker 新一代构建引擎本仓库的 Dockerfile 也通过首行指令声明了语法版本# syntaxdocker.io/docker/dockerfile:1该指令确保构建时使用最新的 Dockerfile 语法如 heredoc 形式的RUN EOF ... EOF块。若你的发行版自带 Docker 版本较旧请先升级到符合要求的版本再执行构建。构建参数Build Arguments详解Dockerfile 中声明了若干可用于定制构建过程的ARG指令。原文档 docs/content/examples/tutorials/docker-build.md 明确列出的可配置构建参数如下构建参数说明默认值DOVECOT_COMMUNITY_REPO是否从 Dovecot 社区仓库安装 Dovecot替代 Debian 软件源0不启用DMS_RELEASE镜像版本号edgeVCS_REVISION构建所用的 Git 提交哈希unknown在 Dockerfile 中可以看到它们的声明位置全局段第 6-8 行ARG DEBIAN_FRONTENDnoninteractive、ARG DOVECOT_COMMUNITY_REPO0、ARG LOG_LEVELtrace最终阶段第 252-253 行ARG DMS_RELEASEedge、ARG VCS_REVISIONunknown在构建时通过--build-arg覆盖默认值docker build \ --build-arg DMS_RELEASEv14.0.0 \ --build-arg VCS_REVISION$(git rev-parse HEAD) \ --tag YOUR CUSTOM IMAGE NAME .DOVECOT_COMMUNITY_REPODovecot 安装来源默认值为0即从 Debian 官方软件源安装 Dovecot。若设置为1则改为从 Dovecot 社区仓库获取更新版本。该参数影响的是镜像内邮件核心组件 Dovecot 的版本来源适合需要追踪社区较新 Dovecot 功能的场景。其实际生效逻辑位于构建阶段执行的基础软件安装脚本由COPY target/scripts/build/packages.sh /build/引入并在 Dockerfile 第 26 行执行。DMS_RELEASE 与 VCS_REVISION版本与来源溯源这两个参数在最终阶段stage-final被用于两件事写入 opencontainers 元数据LABEL。镜像构建完成后可通过docker inspect查看org.opencontainers.image.revision${VCS_REVISION}提交哈希org.opencontainers.image.version${DMS_RELEASE}版本号DMS_RELEASE还会以环境变量的形式固化进镜像Dockerfile 第 289 行ENV DMS_RELEASE${DMS_RELEASE}直接影响容器运行时的行为详见下一节。构建参数如何影响运行时更新检查机制原文档特别提示当DMS_RELEASE不为edge时容器运行时会利用该版本号执行更新检查前提是默认开启的环境变量ENABLE_UPDATE_CHECK1见 docs/content/config/environment.md默认启用设为0可关闭。这一机制在源码中有完整实现链条target/scripts/update-check.sh 第 6 行VERSION${DMS_RELEASE#v}即从构建参数写入的DMS_RELEASE环境变量取出版本号去除v前缀并周期性向 GitHub Releases API 请求最新版本通过dpkg --compare-versions比较后将升级通知邮件发送给POSTMASTER_ADDRESS。target/scripts/start-mailserver.sh 第 132 行if [[ ${DMS_RELEASE} ! edge ]]; then即只有构建为正式版本而非edge开发版时才会启动更新检查守护逻辑。更新检查的间隔由环境变量UPDATE_CHECK_INTERVAL控制默认1d一天一次支持s/m/h/d后缀update-check.sh 第 12-16 行会对非法值做校验并回退到1d。因此如果你构建的是正式发布版本镜像建议按需设置ENABLE_UPDATE_CHECK避免容器持续探测远端版本如果只是本地试验性构建保持默认edge即可跳过更新检查。镜像内部结构三阶段构建源码级解读从 Dockerfile 可以看到镜像采用经典的多阶段构建共三个阶段stage-base第 10 行起基于docker.io/debian:13-slim负责安装基础软件包执行target/scripts/build/packages.sh并引入sedfile、日志辅助脚本等基础工具。stage-main第 32 行起在此阶段汇聚全部功能组件与配置包括ClamAV 病毒库与 freshclam 定时任务第 39-56 行直接复用官方 ClamAV 镜像的库文件以避免构建期额外下载Dovecot 配置COPY target/dovecot/...Rspamd、OAuth2、LDAP 配置Postfix 主配置与 LDAP 查询映射target/postfix 下的ldap-users.cf、ldap-groups.cf、ldap-aliases.cf等Fail2ban、OpenDKIM、OpenDMARC、mta-sts-daemon、Fetchmail、Getmail、Logwatch、Supervisord 的配置与脚本stage-final第 251 行起仅保留镜像运行配置定义工作目录、暴露端口EXPOSE 25 587 143 465 993 110 995 4190SMTP、提交端口、IMAP、SMTPS、IMAPS、POP3、POP3S、ManageSieve入口与启动命令ENTRYPOINT [/usr/bin/dumb-init, --]、CMD [supervisord, -c, /etc/supervisor/supervisord.conf]若干默认环境变量如FETCHMAIL_POLL300、POSTGREY_DELAY300等健康检查HEALTHCHECK --start-period30s CMD dms-healthcheckopencontainers 元数据标签与DMS_RELEASE环境变量了解这一结构有助于你在定制镜像时判断应修改哪个阶段应用配置与脚本主要落在stage-main运行参数与版本元数据落在stage-final。参考官方 CI 如何构建发布镜像仓库的发布流水线 .github/workflows/generic_publish.yml 展示了官方构建时的参数传递方式可作为你自定义构建的参考build-args: | DMS_RELEASE${{ github.ref_type tag github.ref_name || edge }} VCS_REVISION${{ github.sha }} platforms: linux/amd64,linux/arm64即打 tag 时DMS_RELEASE取 tag 名否则取edgeVCS_REVISION取当前提交 SHA。官方同时构建linux/amd64与linux/arm64双架构镜像并启用 GitHub Actions 缓存。若你需要在多架构环境如 ARM 设备运行自建镜像可在自己的构建命令中追加--platform linux/arm64并使用支持多架构的构建器Buildx。构建完成后的验证构建完成后可快速验证镜像是否可用docker images | grep YOUR CUSTOM IMAGE NAME docker inspect YOUR CUSTOM IMAGE NAME \ --format {{json .Config.Labels}}docker inspect输出中应能看到org.opencontainers.image.version与org.opencontainers.image.revision与你传入的--build-arg值一致。随后可参考 docs/content/examples/tutorials/basic-installation.md 使用该镜像启动你的邮件服务器并对照 mailserver.env 配置所需的环境变量。【免费下载链接】docker-mailserverProduction-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container.项目地址: https://gitcode.com/gh_mirrors/do/docker-mailserver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表