SSF0SSF0
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
  • Bash

    • Bash 获取路径在不同类型电脑的区别
  • Git

    • Git 使用 ssh 与 https 的区别
    • Git 回滚、重置与变基
    • 文件名大小写发生变化的坑
    • Git 提交信息规范解读与实践指南
    • Git 历史邮箱统一 + 推送 GitHub 后的远程分支处理指南
  • Docker

    • Docker 命令大全
    • nginx 镜像部署静态文件
    • Docker 运行命令说明
    • 使用 node 镜像运行本地项目
    • 挂载和卷的区别
    • Docker 打包多平台镜像
    • Docker 使用 mysql
    • Docker 容器网络访问问题总结
  • VuePress

    • 使用 VuePress 搭建个人博客概括
  • CI/CD

    • blog 使用 Github-Actions 部署 docker 服务器
  • 服务器

    • 腾讯云使用 ssh 连接服务器(Linux 实例)
    • ssl 证书安装到 docker 服务器
    • 操作系统与架构
    • ssh 连接时长问题
  • 掌握 hosts 文件:本地开发、域名重定向与回调处理完全指南
  • Cloudflare DNS与代理:完全指南

使用 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. 平台差异引发依赖问题

  1. 🌟🌟🌟 平台同步 Node.js 版本(避免版本差异造成的启动失败,依赖运行差异问题):

  2. 🌟🌟🌟 在 Windows 上开发的 Vue 项目包含的依赖是为 Windows 平台编译的,本地(windows)和 Docker 容器(Linux)中共享同一个 node_modules 目录可能会导致依赖冲突,尤其是针对不同平台编译的依赖项(例如,Windows 和 Linux),同平台则无问题。

解决方案

  1. 清理 npm 缓存

有时,npm 缓存可能会导致依赖安装问题。你可以尝试清理 npm 缓存:

docker exec -it container-name npm cache clean --force
  1. 重新安装特定版本的依赖

确保你指定了正确的版本号。例如,你可以尝试安装最新的 XXXX 版本:

# 按照docker镜像版本重新安装依赖
docker exec -it container-name npm install
# 重新安装特定依赖
docker exec -it container-name npm install -D XXXX 版本
  1. 使用 npm audit fix 修复漏洞

如果 npm audit 报告了漏洞,可以尝试运行 npm audit fix 来修复:

docker exec -it container-name npm audit fix
  1. 运行项目时 输入的运行命令区别

第一种运行命令格式: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 热更新有问题:本地文件改动,容器内文件也更新,但是没有重新编译 页面无变化。

最后更新时间:
贡献者: 何风顺
上一页
Docker 运行命令说明
下一页
挂载和卷的区别