Docker - 02 - 生成镜像的文件Dockerfile
写Dockerfile之前先懂 3 个概念概念一句话镜像 Image一套已经装好的迷你操作系统 程序文件 启动方式可以直接运行容器 Container镜像跑起来就是容器层 LayerDockerfile 每一行指令 ≈ 一层某层输入变了该层及之后全部重做两个关键指令的区别RUN — 构建镜像时执行装依赖、generate 等CMD — 容器启动时执行跑你的应用第 0 步新建文件 配套 .dockerignore在项目根目录创建 Dockerfile无后缀首字母大写常见。同时准备 .dockerignore避免把不该拷进镜像的东西带进去node*modules .env .git tests *.md为什么需要nodemodules 会在容器里用 npm ci 重装.env 含密钥不应进镜像tests、.md 与运行无关减小镜像体积。第 1 步选基础镜像 — FROMFROM node:22-bookworm-slim你在做什么 告诉 Docker「从哪个现成环境开始搭」。怎么选部分含义node:22Node.js 22bookworm-slimDebian 12 精简版体积小为什么不用 AlpinePrisma 在 Alpinemusl上常出兼容问题Debian 更稳小白检查点 本地 node -v 尽量与镜像大版本一致本项目用 22。第 2 步定工作目录 — WORKDIRWORKDIR /app你在做什么 在容器里创建并进入 /app后面 COPY、RUN 默认都在这里执行。类比 相当于先 mkdir /app cd /app。第 3 步先只拷依赖清单 — COPY第一次COPY package.json package-lock.json ./你在做什么 只复制 package.json 和 package-lock.json还不拷源码。为什么先拷这两个Docker 按层缓存依赖很少变、源码经常变。先装依赖、后拷代码改 .ts 文件时不必重新 npm ci构建更快。改 package.json → 从第 3 步起全部重做只改 src/*.ts → 第 35 步缓存命中只重做后面的 COPY第 4 步安装依赖 — RUN npm ciRUN npm ci你在做什么 构建镜像时按 package-lock.json 精确安装依赖。RUN npm ci --omitdev,只安装生产依赖npm ci vs npm installnpm cinpm install依据严格按 lock 文件可能改 lock场景CI / Docker 构建本地开发为什么装 devDependencies本项目 “start”: “tsx ./index.ts”tsx 在 devDependencies构建时 prisma generate 也需要 prisma CLI。容器启动走 npm start没有这些会失败。生产环境若改用 node dist/index.js 编译产物可再考虑多阶段构建本项目直接用 tsx所以需要 dev 依赖。第 5 步Prisma 单独处理 — COPY RUN generateCOPY prisma ./prisma RUN npx prisma generate你在做什么只拷 prisma/含 schema.prisma 等在容器内生成 Prisma Client → src/generated/prisma两个常见误区误区真相COPY . . 会自带 ClientCOPY 只复制文件不会执行 generate本地已 generate拷进去就行Windows 生成的是 Windows 引擎Linux 容器里往往跑不了为什么放在 COPY . . 之前功能clone/CI 里通常没有生成物.gitignore 已忽略必须在镜像里 generate缓存只改业务代码时不重复 generate改了什么影响只改 src/*.tsgenerate 层缓存命中改 prisma/schema重跑 generate改 package.json从 npm ci 起全重跑第 6 步复制其余源码 — COPY . .COPY . .你在做什么 把项目其余文件拷进 /app受 .dockerignore 过滤。不会覆盖什么已在容器里 npm ci 的 node_modules 不会被宿主机覆盖.dockerignore 排除了 node_modules第 5 步已 generate 的 Client 保留除非本地有旧生成物被拷进去——本项目 ignore 了一般没问题第 7 步声明端口 — EXPOSEEXPOSE 8080你在做什么 文档性声明「这个容器内的 API 监听 8080」与 index.ts 里 PORT 8080 一致。注意EXPOSE 不会自动映射到宿主机不影响 PostgreSQL :5432、Redis :6379它们是别的容器访问需手动映射dockerrun-p3000:8080 your-image# 浏览器 localhost:3000 → 容器内 8080第 8 步启动命令 — CMDCMD [npm, start]你在做什么 容器启动时执行 npm start等价于 tsx ./index.ts。推荐写法 JSON 数组形式 [“npm”, “start”]避免 shell 解析问题。与 RUN 再记一次指令时机RUN npm ci构建镜像时CMD [“npm”, “start”]每次 docker run 启动容器时完整 Dockerfile 一览FROM node:22-bookworm-slim WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY prisma ./prisma RUN npx prisma generate COPY . . EXPOSE 8080 CMD [npm, start]写完后验证步骤# 1. 构建镜像在项目根目录有 Dockerfile 的地方dockerbuild-tnodejs-api.对应到你的命令部分含义docker build构建镜像-t nodejs-api给镜像打标签名字叫 nodejs-api.构建上下文 当前目录# 2. 运行容器需配好 DATABASE_URL、REDIS 等环境变量dockerrun-p8080:8080 --env-file .env my-node-api# 3. 浏览器或 curl 访问curlhttp://localhost:8080构建时观察输出若只改了源码应看到前几步 CACHED说明层缓存生效。小白易错清单错误后果正确做法先 COPY . . 再 npm ci改一行代码就重装全部依赖先拷 lock再 npm ci最后拷源码省略 prisma generate容器启动报找不到 Client构建时在 Linux 容器内 generate用 npm install 代替 npm ci依赖版本不稳定Docker 构建用 npm ci以为 EXPOSE 就能访问宿主机访问不到加 -p 宿主机端口:8080把 .env 打进镜像密钥泄露写进 .dockerignore运行时 -e 或 --env-file 传入用 Alpine Prisma各种 libc/引擎报错本项目选 Debian slim推荐写作顺序记忆口诀FROM 选环境 ↓ WORKDIR 定目录 ↓ COPY 依赖清单 → RUN 装依赖 ← 利用缓存 ↓ COPY prisma → RUN generate ← 跨平台 缓存 ↓ COPY 源码 ↓ EXPOSE 声明端口 ↓ CMD 启动命令

相关新闻

3步搞定M3U8视频下载:告别分段视频无法保存的完整指南

3步搞定M3U8视频下载:告别分段视频无法保存的完整指南

3步搞定M3U8视频下载:告别分段视频无法保存的完整指南 【免费下载链接】m3u8-downloader 一个M3U8 视频下载(M3U8 downloader)工具。跨平台: 提供windows、linux、mac三大平台可执行文件,方便直接使用。 项目地址: https://gitcode.com/gh_mirrors/m3u8d/m3u8-do…

2026/6/30 2:38:11阅读更多 →
魔兽世界API与宏工具:5分钟快速上手指南,提升游戏效率300%

魔兽世界API与宏工具:5分钟快速上手指南,提升游戏效率300%

魔兽世界API与宏工具:5分钟快速上手指南,提升游戏效率300% 【免费下载链接】wow_api Documents of wow API -- 魔兽世界API资料以及宏工具 项目地址: https://gitcode.com/gh_mirrors/wo/wow_api 魔兽世界API与宏工具是一个专为魔兽世界玩家和插件…

2026/6/30 2:38:11阅读更多 →
Python变量作用域与命名空间详解:从LEGB到代码实践

Python变量作用域与命名空间详解:从LEGB到代码实践

什么是命名空间?命名空间(Namespace)是一个存储变量名到对象映射的容器。在Python中,命名空间就像一个个"抽屉",每个抽屉里存放着不同区域的变量。Python有三种主要的命名空间:命名空间类型创建时…

2026/6/30 2:38:11阅读更多 →
AutoCAD2027 下载安装教程(附安装包)AutoCAD2027 安装步骤(保姆级)

AutoCAD2027 下载安装教程(附安装包)AutoCAD2027 安装步骤(保姆级)

文章目录前言AutoCAD2027 安装包下载AutoCAD2027 安装教程AutoCAD2027入门教程:从基础操作到二维绘图全流程前言 AutoCAD2027是Autodesk公司最新推出的计算机辅助设计(CAD)软件,它在保持强大二维绘图与三维建模能力的同时&#x…

2026/6/30 4:48:18阅读更多 →
CAXA电子图版2024 安装教程(附安装包)电子图板安装步骤(保姆级)

CAXA电子图版2024 安装教程(附安装包)电子图板安装步骤(保姆级)

文章目录前言CAXA电子图版2024 下载地址CAXA电子图版2024 安装教程CAXA电子图版2024新手入门教程:从安装到绘制第一张图纸前言 CAXA电子图版是数码大方自主研发的一款国产二维CAD平台,在国内机械设计、建筑制图等领域有着相当广泛的用户基础。这款电子图…

2026/6/30 4:48:18阅读更多 →
几十万预算的办公楼照明改造,怎么找到靠谱服务商

几十万预算的办公楼照明改造,怎么找到靠谱服务商

很多持有老旧商务楼的业主都有过类似困扰:想做照明改造,预算只有几十万到一百万,找小团队怕踩坑,找大牌服务商又怕人家嫌项目小不肯接,最后要么改完效果差强人意,要么后期故障没人管,钱花了还闹…

2026/6/30 4:48:18阅读更多 →
行政人事自动化实战:简历自动筛选录入Excel、考勤数据自动汇总、表单自动批量填写、邮件自动收发整理全链路方案

行政人事自动化实战:简历自动筛选录入Excel、考勤数据自动汇总、表单自动批量填写、邮件自动收发整理全链路方案

今天这篇文章,把我给公司搭的行政人事自动化方案完整分享出来。覆盖四个核心场景:简历自动筛选录入Excel、考勤数据自动汇总、表单自动批量填写、邮件自动收发整理。全部基于真实落地经验,不是纸上谈兵。一、简历自动筛选录入Excel&#xff1…

2026/6/30 4:48:18阅读更多 →
如何快速上手Ketones:面向初学者的完整eBPF内核观察指南

如何快速上手Ketones:面向初学者的完整eBPF内核观察指南

如何快速上手Ketones:面向初学者的完整eBPF内核观察指南 【免费下载链接】ketones A kempt eBPF tool for a new environments 项目地址: https://gitcode.com/openeuler/ketones 前往项目官网免费下载:https://ar.openeuler.org/ar/ Ketones是o…

2026/6/30 4:48:18阅读更多 →
做标书时关掉微信通知,专注两小时顶得过一整天。

做标书时关掉微信通知,专注两小时顶得过一整天。

在标书制作的紧张氛围中,时间仿佛被按下了快进键。许多从业者都有过这样的体验:明明在办公桌前坐了一整天,却总觉得进度缓慢,关键内容迟迟无法完成。其实,问题的根源往往不在于能力或资源,而在于那些被我们…

2026/6/30 4:43:18阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/30 4:03:30阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/30 4:36:27阅读更多 →
为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南 【免费下载链接】Destiny-2-Solo-Enabler Repo containing the C# and XAML code for the D2SE program. Included is also the dependency for the program, and image asset. 项目地址: https://gitcode…

2026/6/30 0:02:58阅读更多 →
第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

1. PowerPoint 2010基础操作全攻略 刚接触PowerPoint 2010时,很多人会被它复杂的界面吓到。其实只要掌握几个核心区域,就能快速上手。我最开始用PPT时,经常找不到功能按钮在哪,后来发现主要操作都集中在顶部功能区。 工作窗口主要…

2026/6/30 0:02:58阅读更多 →
XGBoost超参数实战:从理论到调优策略

XGBoost超参数实战:从理论到调优策略

1. XGBoost超参数基础认知 第一次接触XGBoost时,我被它那密密麻麻的参数列表吓到了。这感觉就像面对一架波音747的驾驶舱——每个按钮都可能有神奇的效果,但按错了就可能坠机。经过多年实战,我发现其实掌握十几个核心参数就能解决90%的问题。…

2026/6/30 0:02:59阅读更多 →