当前位置: 首页 > article >正文

dockerfile系列(六) 进阶技巧与调试-Dockerfile的黑魔法

进阶技巧与调试Dockerfile 的黑魔法本文基于 Docker 24.x BuildKit系列压轴篇带你从会用到精通。场景引入构建失败了咋排查写了几十行的 Dockerfile构建到第 15 步报错了 [builder 4/6] RUN npm run build: #15 2.341 Error: Cannot find module webpack我想进去看看node_modules到底装没装但构建失败的镜像直接被删了…这时候就需要一些黑魔法来调试和优化。今天把压箱底的技巧全掏出来。技巧 1调试构建过程——保留中间层方法 A构建到指定目标多阶段构建时可以只构建到某个阶段# 只构建到 deps 阶段看看依赖装得对不对dockerbuild--targetdeps-tmy-app:debug.# 启动容器进去看dockerrun--rm-itmy-app:debugshlsnode_modules|head方法 B利用缓存在失败层前停住FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . # 插入这行调试构建时停在这里启动容器检查 RUN echo DEBUG POINT \ ls -la \ cat package.json RUN npm run build方法 C使用 BuildKit 的--target 导出# 导出指定阶段的文件系统到目录DOCKER_BUILDKIT1dockerbuild\--targetbuilder\--outputtypelocal,dest./debug\.# 现在 ./debug 里就是 builder 阶段的完整文件系统lsdebug/app/node_modules技巧 2RUN 指令合并——减少层数每条RUN创建一层。层数太多会增加镜像体积和管理开销# ❌ 之前5 层 RUN apt-get update RUN apt-get install -y curl RUN apt-get install -y vim RUN apt-get clean RUN rm -rf /var/lib/apt/lists/*# ✅ 优化1 层而且清理了缓存 RUN apt-get update \ apt-get install -y curl vim \ apt-get clean \ rm -rf /var/lib/apt/lists/*注意合并太多会降低缓存命中率。建议把一起变的指令合并分开变的保持独立。技巧 3BuildKit 缓存挂载——依赖下载飞起来这是 BuildKit 的杀手级特性。把包管理器的缓存挂载到主机跨构建复用# syntaxdocker/dockerfile:1 FROM node:18-alpine WORKDIR /app COPY package*.json ./ # 挂载 npm 缓存到主机目录 RUN --mounttypecache,target/root/.npm \ npm ci COPY . . RUN npm run build效果第一次构建正常下载依赖第二次构建node_modules层变了但 npm 缓存还在不用重新从网络下载特别适合 CI/CD 环境更多缓存挂载场景# apt 缓存 RUN --mounttypecache,target/var/cache/apt \ apt-get update apt-get install -y gcc # pip 缓存 RUN --mounttypecache,target/root/.cache/pip \ pip install -r requirements.txt # Go 模块缓存 RUN --mounttypecache,target/go/pkg/mod \ go mod download # Maven 缓存 RUN --mounttypecache,target/root/.m2 \ mvn package技巧 4BuildKit 密钥挂载——安全使用私有仓库需要从私有 Git 仓库或 npm 仓库拉取别把 SSH 密钥拷进镜像# syntaxdocker/dockerfile:1 FROM node:18-alpine WORKDIR /app # 挂载 SSH 密钥构建时可用不进入镜像层 RUN --mounttypessh,idgithub \ git clone gitgithub.com:mycompany/private-repo.git COPY package*.json ./ RUN --mounttypecache,target/root/.npm \ npm ci构建时启用 SSH 代理# 启动 ssh-agent 并添加密钥eval$(ssh-agent)ssh-add ~/.ssh/id_rsa# 构建时传入 SSH 代理DOCKER_BUILDKIT1dockerbuild--sshdefault-tmy-app.密钥只在构建时可用不会留在镜像里。技巧 5并行构建——多服务同时构建docker-compose或docker buildx支持并行构建多个服务# docker-compose.ymlversion:3.8services:frontend:build:context:./frontendtarget:productionbackend:build:context:./backendtarget:productionnginx:build:context:./nginx# 并行构建所有服务docker-composebuild--parallel技巧 6.dockerignore的进阶玩法用通配符精确控制# 忽略所有 .log但保留 error.log *.log !error.log # 忽略所有 .md但保留 README *.md !README.md # 忽略 src 下的测试文件但保留测试数据 src/**/*.test.js !src/**/__fixtures__/配合多阶段精确控制上下文# 阶段 1只拷贝 package.json利用缓存 FROM node:18-alpine AS deps WORKDIR /app COPY package*.json ./ RUN npm ci # 阶段 2只拷贝构建需要的文件 FROM node:18-alpine AS builder WORKDIR /app COPY --fromdeps /app/node_modules ./node_modules COPY src ./src COPY public ./public COPY package.json tsconfig.json ./ RUN npm run build配合.dockerignore# 构建阶段不需要这些 *.md docs/ tests/ .github/技巧 7一个完美的生产级 Dockerfile 完整示例把系列所有知识融会贯通一个 Node.js 项目的终极 Dockerfile# syntaxdocker/dockerfile:1 # 构建参数 ARG NODE_VERSION18 ARG APP_ENVproduction ARG NPM_REGISTRYhttps://registry.npmjs.org # 阶段 1依赖安装 FROM node:${NODE_VERSION}-alpine AS deps WORKDIR /app # 利用缓存挂载加速 RUN --mounttypecache,target/root/.npm \ --mounttypebind,sourcepackage.json,targetpackage.json \ --mounttypebind,sourcepackage-lock.json,targetpackage-lock.json \ npm ci --registry${NPM_REGISTRY} # 阶段 2构建 FROM node:${NODE_VERSION}-alpine AS builder WORKDIR /app COPY --fromdeps /app/node_modules ./node_modules COPY . . ARG APP_ENV ENV NODE_ENV${APP_ENV} RUN npm run build # 阶段 3生产运行 FROM node:${NODE_VERSION}-alpine AS runner # 安全创建非 root 用户 RUN addgroup -g 1001 -S nodejs \ adduser -S appuser -u 1001 WORKDIR /app # 只拷贝必要文件 COPY --frombuilder --chownappuser:nodejs /app/dist ./dist COPY --frombuilder --chownappuser:nodejs /app/node_modules ./node_modules COPY --frombuilder --chownappuser:nodejs /app/package.json ./ USER appuser # 运行时配置 ENV NODE_ENVproduction ENV PORT3000 EXPOSE ${PORT} # 健康检查 HEALTHCHECK --interval30s --timeout3s --start-period5s --retries3 \ CMD node -e require(http).get(http://localhost:${PORT}/health, (r) r.statusCode 200 ? process.exit(0) : process.exit(1)) CMD [node, dist/server.js]构建命令DOCKER_BUILDKIT1dockerbuild\--build-argNODE_VERSION20\--build-argNPM_REGISTRYhttps://registry.npmmirror.com\-tmy-app:latest.运行命令dockerrun\-d\--namemy-app\-p3000:3000\-eDATABASE_URLpostgres://...\--read-only\--security-optno-new-privileges:true\--memory512m\--cpus1.0\my-app:latest系列回顾六篇知识图谱第一篇入门 └── FROM / RUN / COPY / CMD / EXPOSE 第二篇缓存优化 └── 分层原理、指令顺序、缓存命中 第三篇多阶段构建 └── 多个 FROM、COPY --from、镜像瘦身 第四篇安全实践 └── 非 root 用户、精简镜像、.dockerignore、HEALTHCHECK 第五篇动态配置 └── ARG vs ENV、多环境构建、版本注入 第六篇进阶调试 └── BuildKit、缓存挂载、密钥挂载、并行构建一句话总结BuildKit 是 Dockerfile 的涡轮增压缓存挂载让依赖下载飞起密钥挂载让私有仓库安全访问多阶段构建让镜像瘦到极限——配合前面五篇的基础你已经能写出生产级的 Dockerfile 了。互动时间六篇系列到这就结束了。回顾一下你最大的收获是什么生产环境里你最常用哪个技巧有没有想让我补充的主题比如 Docker Compose、CI/CD 集成、Kubernetes 部署等评论区聊聊

相关文章:

dockerfile系列(六) 进阶技巧与调试-Dockerfile的黑魔法

进阶技巧与调试:Dockerfile 的"黑魔法"本文基于 Docker 24.x BuildKit,系列压轴篇,带你从"会用"到"精通"。场景引入:构建失败了,咋排查? 写了几十行的 Dockerfile&#xff…...

FakeLocation终极指南:重新掌控你的Android位置隐私

FakeLocation终极指南:重新掌控你的Android位置隐私 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 在数字时代,位置隐私已成为智能手机用户最关心的问题之…...

SwiftUI图像填充与按钮布局

在SwiftUI中,我们常常需要将图像填充整个屏幕,同时在图像上叠加其他UI元素,例如按钮。今天我们来探讨如何在保持图像充满屏幕的同时,确保底部按钮的可见性。 背景 考虑一个场景:我们有一个从URL获取的图片,并希望它填满整个屏幕,同时在图片的底部有一排按钮。我们使用…...

OpenCV视频处理核心技术及工程实践指南

1. 图像处理与视频生成的核心逻辑在计算机视觉领域,图像到视频的转换本质上是对时序图像序列的处理过程。OpenCV作为跨平台的计算机视觉库,提供了从基础图像操作到高级视频处理的完整工具链。这个技术栈在安防监控、医学影像分析、工业质检等领域有广泛应…...

Qwen3.5-2B部署教程:HTTPS反向代理配置(Nginx)+域名访问企业内网方案

Qwen3.5-2B部署教程:HTTPS反向代理配置(Nginx)域名访问企业内网方案 1. 项目概述 Qwen3.5-2B是一款20亿参数的轻量级多模态大语言模型,专为企业内网部署优化设计。该模型支持轻量对话、文案创作、多语言翻译、基础代码生成等功能…...

重构网盘资源获取工作流:baidupankey的智能解析方法论

重构网盘资源获取工作流:baidupankey的智能解析方法论 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字资源分享的日常场景中,百度网盘链接的提取码查询已成为一个普遍存在的效率瓶颈。当面对海量…...

OpenCode:不是工具替代,而是一种新的编程权力结构

OpenCode:不是工具替代,而是一种新的编程权力结构 这段时间,AI 编程工具已经从“尝鲜玩具”慢慢变成了很多开发者日常工作的一部分。写脚本、改 Bug、补注释、重构代码、搭 demo,很多事情现在都可以先让 AI 跑一遍,再由…...

墨语灵犀开发环境搭建:Node.js后端服务快速集成指南

墨语灵犀开发环境搭建:Node.js后端服务快速集成指南 最近在折腾AI应用,想把墨语灵犀的对话能力集成到自己的项目里,发现网上关于后端集成的完整教程不多。作为一个Node.js老手,我花了两天时间踩坑、调试,终于把整个流…...

Iwara下载工具:解锁视频下载的智能解决方案

Iwara下载工具:解锁视频下载的智能解决方案 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool 你是否曾在Iwara平台上遇到心仪的视频却无法保存的困扰?Iwar…...

GHelper风扇曲线自定义:为华硕笔记本打造个性化的智能散热方案

GHelper风扇曲线自定义:为华硕笔记本打造个性化的智能散热方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, S…...

Alas智能脚本技术架构深度解析:碧蓝航线自动化引擎的创新应用

Alas智能脚本技术架构深度解析:碧蓝航线自动化引擎的创新应用 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript Al…...

PyTorch 高频面试题

一、 核心概念与张量操作 1. 什么是PyTorch? PyTorch是一个开源的机器学习库,主要用于开发和训练基于神经网络的深度学习模型。其核心特点是动态计算图(又称即时执行模式),支持GPU加速,并集成了自动微分功…...

Qwen3.5-9B-GGUF基础教程:app.py源码结构解析与Gradio组件扩展方法

Qwen3.5-9B-GGUF基础教程:app.py源码结构解析与Gradio组件扩展方法 1. 项目背景与模型介绍 Qwen3.5-9B是阿里云开源的通义千问3.5系列中的90亿参数稠密模型,采用Gated Delta Networks架构和混合注意力机制(75%线性25%标准)。原生…...

ARM NEON与VFP向量指令集优化指南

1. ARM NEON与VFP技术概述 在移动计算和嵌入式系统领域,ARM架构凭借其出色的能效比占据主导地位。随着多媒体处理、机器学习等计算密集型任务的普及,传统的标量指令集已难以满足性能需求。NEON和VFP作为ARM架构的SIMD(单指令多数据&#xff0…...

数组和切片实战

1).检查某个值是否在数组中:如果要检查某个值是否在在数组或切片中.则需要根据相应的类型进行逐个对比.示例:package mainimport ("encoding/csv""fmt""math/rand""os""regexp""strings""time""un…...

巴拿马电源在数据中心的应用

巴拿马电源借用巴拿马运河极大缩短大西洋和太平洋之间海上航程的战略意义,其在数据中心供配电系统设计中,可极大地缩短从传统供电中心10kV到AC UPS或HVDC柜间的漫长链路,实现更加高效快捷地供电。系统变化原理框图如下图所示巴拿马系统变化原…...

贪心算法(Greedy Algorithm)详解:从理论到C++实践

目录1. 什么是贪心算法2. 贪心算法的适用条件3. 贪心算法的通用模板4. 经典贪心算法问题详解4.1 活动选择问题4.2 哈夫曼编码4.3 零钱兑换问题4.4 区间调度问题4.5 背包问题(分数背包)5. 贪心算法的证明技术6. 贪心算法的局限性7. 实际应用场景8. 总结与…...

梯度下降算法原理与Python实现详解

1. 梯度下降优化算法基础解析梯度下降是现代机器学习和深度学习中最核心的优化算法之一。我第一次接触这个概念是在研究线性回归模型时,当时被它简洁而强大的迭代优化思想所震撼。本质上,梯度下降是通过不断沿着目标函数梯度(即最陡下降方向&…...

猫狗分类实战:从数据预处理到模型优化的完整指南

1. 项目概述:猫狗照片分类的挑战与价值在计算机视觉领域,猫狗分类一直是个经典的入门项目。别看这个任务听起来简单,要实现97%的准确率可不容易。我花了三个月时间反复调试模型,最终在Kaggle的Dogs vs Cats数据集上达到了这个成绩…...

MyBatis学习(三)

一、SqlMapConfig.xml 配置文件详解1. 使用 properties 标签管理数据库信息为了便于维护&#xff0c;通常将数据库连接信息抽取到独立的 .properties 文件中。方式一&#xff1a;直接在 properties 标签内定义<?xml version"1.0" encoding"UTF-8"?>…...

AI驱动的代码安全审计工具:混合扫描策略与CI/CD集成实践

1. 项目概述&#xff1a;一个为AI Agent设计的智能安全审计工具 在代码安全领域&#xff0c;我们常常面临一个两难困境&#xff1a;传统的静态分析工具&#xff08;如SonarQube、Checkmarx&#xff09;虽然功能强大&#xff0c;但配置复杂、扫描速度慢&#xff0c;且误报率&am…...

MySQL:Fuzzy Checkpoint

一、 为什么需要“模糊&#xff08;Fuzzy&#xff09;”&#xff1f;对比 Sharp Checkpoint Sharp Checkpoint&#xff08;全量检查点&#xff09;&#xff1a; 顾名思义&#xff0c;要求将 Buffer Pool 中所有的脏页一次性全部刷新到磁盘。 触发时机&#xff1a; 通常只在数据…...

雁塔区底盘异响松散推荐哪家

在雁塔区开车的朋友们&#xff0c;是否经常被爱车的底盘问题所困扰&#xff1f;底盘咯吱响、过坎咯噔响、打方向咔咔响、跑起来松散晃悠……这些问题不仅严重影响驾驶体验&#xff0c;还可能埋下安全隐患。别再乱修乱换件了&#xff0c;今天就给大家推荐一家靠谱的汽修店——尚…...

nli-MiniLM2-L6-H768保姆级教程:Windows/Mac/Linux三平台NLI本地化部署

nli-MiniLM2-L6-H768保姆级教程&#xff1a;Windows/Mac/Linux三平台NLI本地化部署 1. 引言 nli-MiniLM2-L6-H768是一个专为自然语言推理(NLI)与零样本分类设计的轻量级交叉编码器(Cross-Encoder)模型。它虽然体积小巧&#xff0c;但在精度上接近BERT-base模型&#xff0c;同…...

XUnity Auto Translator

XUnity Auto Translator 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 项目简介 这是一个高级翻译插件&#xff0c;可用于自动翻译基于Unity的游戏&#xff0c;并提供手动翻译所需的工具。 核心功能 …...

梯度下降的使用-房价预测

一个小小的建议&#xff1a;可以安装JupyterLab来调试练习&#xff0c;真的很方便。 """ 房价预测示例 - 使用梯度下降求解线性回归使用真实数据集&#xff1a;加州房价数据集 (California Housing Dataset) 来源&#xff1a;1990年加州人口普查数据特征说明&am…...

基于Nanobot的智能写作助手:自媒体内容生成系统

基于Nanobot的智能写作助手&#xff1a;自媒体内容生成系统 1. 引言 每天清晨&#xff0c;自媒体创作者小王都要面对同样的挑战&#xff1a;找热点、写大纲、创作内容、排版发布。这个过程往往需要3-4个小时&#xff0c;而且质量参差不齐。直到他发现了一个解决方案——基于N…...

OFA图像描述模型LaTeX科研文档辅助:自动为图表生成Caption

OFA图像描述模型LaTeX科研文档辅助&#xff1a;自动为图表生成Caption 写论文最烦人的步骤是什么&#xff1f;对我而言&#xff0c;除了反复修改格式&#xff0c;就是给那一大堆图表写Caption&#xff08;图注和表注&#xff09;。每张图、每个表&#xff0c;都得绞尽脑汁想一…...

OpenAI Symphony:生产级AI应用开发框架的设计理念与工程实践

1. 项目概述与核心价值最近在AI应用开发圈里&#xff0c;一个名为“Symphony”的项目引起了我的注意。它来自OpenAI&#xff0c;这个标签本身就意味着重量级。但和很多人想象的不同&#xff0c;Symphony并非一个全新的、独立的AI模型&#xff0c;而是一个面向生产环境的AI应用开…...

专业领域嵌入模型微调与高效数据清洗实践

1. 项目概述&#xff1a;定制化嵌入模型提升专业领域检索效果 在构建专业领域的信息检索系统时&#xff0c;通用嵌入模型的表现往往不尽如人意。以法律文书、医疗记录或多轮客户对话这类专业数据为例&#xff0c;标准模型难以捕捉其中的专业术语、上下文关联和领域特定语义。Co…...