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

Dockerfile从零入门:手把手教你打包Node.js应用,解决镜像构建的常见坑

代码写完了,在本地跑得好好的,怎么把它打包成Docker镜像,部署到服务器上?

答案就是Dockerfile。

今天这篇文章,我们用Node.js应用做例子,从零开始写一个Dockerfile,把应用打包成镜像,顺便把常见的坑都踩一遍。

一、Dockerfile是什么?

Dockerfile是一个文本文件,里面写着“如何构建这个镜像”的所有指令。它就像一张蓝图,Docker按照这张蓝图把应用打包成镜像。

重要:文件名必须叫Dockerfile,首字母大写,没有后缀名。

二、写一个最简单的Dockerfile

我们的Node.js应用需要运行在Node环境里,所以第一件事是找一个带Node的基础镜像:

dockerfile

FROM node:20-alpine

FROM是所有Dockerfile的第一行,指定基础镜像。这里用了node:20-alpine——一个轻量级的Node镜像,体积小,适合生产环境。

三、复制代码并安装依赖

把代码复制进镜像,然后安装依赖:

dockerfile

# 创建应用目录 RUN mkdir -p /home/app # 复制所有文件 COPY . /home/app # 设置工作目录 WORKDIR /home/app # 安装依赖 RUN npm install

注意几点:

  • RUN是在构建镜像时执行的命令

  • COPY是从宿主机复制文件到镜像里

  • WORKDIR设置工作目录,后面的命令都会在这个目录下执行

一个常见错误:不要把本地的node_modules复制进镜像。因为本地依赖可能是旧版本,应该在镜像里重新npm install,保证依赖是最新的。

四、指定启动命令

最后,告诉容器启动时运行什么:

dockerfile

CMD ["node", "server.js"]

CMD是容器启动时执行的命令。一个Dockerfile只能有一个CMD

完整的Dockerfile:

dockerfile

FROM node:20-alpine ENV MONGO_DB_USERNAME=admin \ MONGO_DB_PWD=password RUN mkdir -p /home/app COPY . /home/app WORKDIR /home/app RUN npm install CMD ["node", "server.js"]

五、构建镜像

在Dockerfile所在目录执行:

bash

docker build -t my-app:1.0 .
  • -t my-app:1.0:给镜像起名字和版本号

  • .:Dockerfile所在的路径(当前目录)

构建完成,用docker images就能看到新镜像。

六、运行容器

bash

docker run my-app:1.0

如果一切正常,你会看到app listening on port 3000!。如果报错,用docker logs查看日志。

七、踩坑与解决

坑1:找不到server.js

现象:启动容器报错Error: Cannot find module '/server.js'

原因:没有设置WORKDIRCMD里的相对路径找不到文件。

解决:加上WORKDIR /home/app

坑2:进入容器报错bash: not found

现象docker exec -it <容器ID> /bin/bash报错。

原因:Alpine基础镜像没有安装bash。

解决:用/bin/sh代替/bin/bash

bash

docker exec -it <容器ID> /bin/sh

坑3:修改Dockerfile后镜像没变

现象:改了Dockerfile,重新构建后还是老样子。

原因:Docker不会自动删除旧镜像,你还在用旧的。

解决:先删旧容器,再删旧镜像,最后重新构建。

bash

# 查看所有容器(包括已停止的) docker ps -a # 删除旧容器 docker rm <容器ID> # 删除旧镜像 docker rmi my-app:1.0 # 重新构建 docker build -t my-app:1.0 .

八、优化:只复制需要的文件

上面的例子把整个项目目录都复制进了镜像,包括Dockerfile、README等不需要的文件。可以这样优化:

dockerfile

# 只复制app目录下的文件 COPY ./app /home/app

或者用.dockerignore文件排除不需要的文件,类似.gitignore

写在最后

Dockerfile的核心就几条指令:FROM选基础镜像,COPY复制代码,RUN装依赖,CMD定启动命令。

记住几个关键点:

  • 文件名必须是Dockerfile

  • RUN是构建时执行,CMD是启动时执行

  • 修改Dockerfile后要先删旧镜像再重新构建

  • 轻量镜像用/bin/sh而不是/bin/bash

掌握了这些,你就能把任何应用打包成Docker镜像了。

http://www.jsqmd.com/news/604504/

相关文章:

  • CVPR2022逆向蒸馏(Reverse Distillation)源码解读与复现:从One-Class Embedding到异常图生成
  • 夜光荧光发光纱线源头厂家直供 高亮持久价优打造吸睛爆款 - 企业推荐官【官方】
  • 基于Vue的社区医疗公益服务系统[vue]-计算机毕业设计源码+LW文档
  • 如何快速解决Hackintosh配置难题:OpCore-Simplify终极解决方案指南
  • Docker镜像推送到私有仓库完整指南:从命名规范到AWS ECR实战
  • AI辅助开发:借助快马多模型能力打造智能静电地板施工方案设计器
  • 自闭症机构大揭秘:如何为孩子找到最佳选择? - 品牌测评鉴赏家
  • 2026实测|5款AI自动生成PPT工具推荐,小白也能10分钟出专业稿 - 品牌测评鉴赏家
  • 国内专业温变纱线生产厂家该选哪家 - 企业推荐官【官方】
  • 科研人效率工具:如何用CiteSpace 6.3.R1快速梳理文献,找到你的论文创新点?
  • STM32F103C8T6 Bootloader跳转APP触发HardFault:中断管理不当的排查与修复
  • MBTI职业性格测试
  • 54.替换数字(字符串/双指针法)
  • 量子门矩阵运算慢如蜗牛,如何用现代C++20 constexpr+模板元编程将单核QVM仿真提速19.3倍?
  • 026 实测|5 款 AI 生成 PPT 工具推荐,新手也能 10 分钟搞定专业汇报 - 品牌测评鉴赏家
  • NaViL-9B效果展示:复杂背景图中多目标识别+关系推理能力演示
  • 2026年SCI论文AI率超标怎么办?3步从60%降到期刊要求以内
  • 2026实测|3款AI生成PPT工具横评,告别熬夜改稿,新手也能直接冲 - 品牌测评鉴赏家
  • 【数据集】A股上市公司深度合成算法业务数据(2001-2024)
  • the-glorious-dotfiles 性能优化技巧:10 个提升桌面响应速度的方法
  • GetQzonehistory:数字记忆守护者的开源解决方案
  • 【等保合集】800余份等保三级、等保2.0、等保二级、等保测评作业指导、全套信息安全管理体系文件、标准规范方案报告合集(PPT+WORD+PDF)
  • 深入理解快速排序:从数组到链表,递归与非递归全解析
  • Golang怎么做连接池优化_Golang连接池优化教程【通俗】
  • 实测6款PPT生成软件|AI博主私藏,新手零门槛,告别熬夜改排版 - 品牌测评鉴赏家
  • 打工人救星!这些PPT美化工具轻松解放双手 - 品牌测评鉴赏家
  • “肇”向西南,“渝”你共赢!“广货行天下・肇庆优品赴渝”重庆专场圆满落幕 - 企业推荐官【官方】
  • 我用AI替换了高级工程师,结果...
  • 实测23款PPT生成软件,2026年最新排名!AI博主亲测,新手零门槛也能快速出片 - 品牌测评鉴赏家
  • 从零配置速腾聚创RS系列雷达:最新驱动安装与lio-sam适配全指南(含ROS1环境搭建)