使用 node 镜像运行本地项目
1. 绑定挂载(Bind Mounts)
直接将主机文件系统中的目录挂载到容器中的指定路径。适用于开发环境,因为它可以使代码和依赖项的修改立即生效。 挂载和卷的区别
首先,启动一个 Node:xxx 版本的容器,并将当前目录挂载到容器内。这样,你可以访问和修改宿主机上的文件。
docker run -d --name container-name -p 6666:8888 -v $(pwd):/usr/src/app -w /usr/src/app node:xxx tail -f /dev/null
解释一下上面的命令:
-d:以后台模式运行容器。
-name project-name:为容器指定一个名称 project-name。
🌟🌟🌟 -p 6666:8888 :将容器的 8888 端口映射到宿主机的 6666 端口,这里也要注意项目启动的端口也要为 8888,不然项目启动端口映射不到容器端口。
🌟🌟🌟 -v $(pwd):/usr/src/app:将当前目录挂载到容器内的 /usr/src/app 目录(当然目录可以自己修改,但是要和项目(-w)启动时挂载的目录一致)。macOS 获取路径和 windows 获取路径的区别。
🌟🌟🌟 -w /usr/src/app:设置工作目录为 /usr/src/app,
因为 -v 只是把宿主机的文件挂在到了容器 /usr/src/app 所以也要设置启动时的工作目录,容器启动后,任何命令(如 RUN、CMD 或 ENTRYPOINT)的默认执行路径
。node:xxx: Node.js xxx 镜像。
🌟 tail -f /dev/null:保持容器运行,这里只是容器在运行还要下一步去启动容器项目。
使用 docker exec 命令在已经运行的容器中执行命令(也可以进入桌面端,进入创建的 continer 找到 exec 然后手动执行命令)。例如,安装项目依赖。
docker exec -it container-name npm run XXXX
解释一下上面的命令:
-it:以交互模式运行命令。
project-name:容器的名称。
npm run XXXX:在容器中运行 npm run 命令。
当然也可以把以上的命令合并成一步:
docker run -d --name container-name -p 6666:8888 -v $(pwd):/usr/src/app -w /usr/src/app node:xxx npm run XXXX
#多执行使用下面这个 npm run XXXX && tail -f /dev/null 顺序不要错 tail -f /dev/null 会无限期运行, && 是顺序执行
docker run -d --name container-name -p 6666:8888 -v $(pwd):/usr/src/app -w /usr/src/app node:xxx bash -c "npm run XXXX && tail -f /dev/null"
2. Dockerfile
使用 Dockerfile:在 Dockerfile 中定义所有依赖项的安装步骤,这样每次构建容器镜像时,依赖项都会自动安装。
FROM node:22
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
CMD ["npm", "run","docs:dev"]
3. Docker Compose
使用 Docker Compose:如果你的项目有多个容器,可以使用 Docker Compose 来管理和启动它们,并确保每个容器都有正确的依赖项。
version: "3"
services:
app:
image: node:22
container_name: container-name
ports:
- "6666:8888"
volumes:
- .:/usr/src/app # 绑定挂载
working_dir: /usr/src/app
command: tail -f /dev/null
启动服务:
docker-compose up -d
解释一下上面的命令:
up:启动服务。
-d:以后台模式运行容器。
4. 平台差异引发依赖问题
🌟🌟🌟 平台同步 Node.js 版本(避免版本差异造成的启动失败,依赖运行差异问题):
🌟🌟🌟 在 Windows 上开发的 Vue 项目包含的依赖是为 Windows 平台编译的,本地(windows)和 Docker 容器(Linux)中共享同一个 node_modules 目录可能会导致依赖冲突,尤其是针对不同平台编译的依赖项(例如,Windows 和 Linux),同平台则无问题。
解决方案
- 清理 npm 缓存
有时,npm 缓存可能会导致依赖安装问题。你可以尝试清理 npm 缓存:
docker exec -it container-name npm cache clean --force
- 重新安装特定版本的依赖
确保你指定了正确的版本号。例如,你可以尝试安装最新的 XXXX 版本:
# 按照docker镜像版本重新安装依赖
docker exec -it container-name npm install
# 重新安装特定依赖
docker exec -it container-name npm install -D XXXX 版本
- 使用 npm audit fix 修复漏洞
如果 npm audit 报告了漏洞,可以尝试运行 npm audit fix 来修复:
docker exec -it container-name npm audit fix
- 运行项目时 输入的运行命令区别
第一种运行命令格式:npm run xxx, macOS 与 windows 运行命令格式相同
docker exec -it container-name npm run xxx
第二种运行命令格式:npm run xxx:xxx, 则需要区分运行环境
- macOS 里面运行:
docker exec -it container-name npm run "xxx:xxx"
- windows 里面运行:
docker exec -it container-name npm run xxx:xxx
项目热更新问题
macOS 热更新没问题 本地文件改动,容器内文件自动更新,重新编译 页面变化。
windows 热更新有问题:本地文件改动,容器内文件也更新,但是没有重新编译 页面无变化。