我遇到一个问题:在修改
node_modules
中的依赖项后,Docker 似乎没有更新 package.json
文件夹。即使在重建 Docker 映像和容器之后,应用程序仍然会抛出与缺少依赖项相关的错误。仅当我在重建之前完全删除容器及其关联卷时,对 node_modules
的更改才会生效。
Dockerfile:
FROM node:22-alpine
RUN npm install -g npm@latest
USER node
WORKDIR /app
COPY --chown=node:node package.json package-lock.json ./
RUN npm install
COPY . .
EXPOSE 5173
CMD ["npm", "run", "dev"]
docker-compose.yml
services:
npm-test:
build: .
ports:
- "5173:5173"
volumes:
- .:/app
- node_modules_docker:/app/node_modules
volumes:
node_modules_docker:
重现步骤:
构建并运行容器(一切正常):
docker compose up --build
从
package.json
中删除重要的依赖项,例如@vitejs/plugin-react
运行
npm install
来更新 package-lock.json
停止并删除容器、映像和卷,然后重建(使用以下命令删除所有内容,或替换 ID 以定位特定的 ID):
docker stop $(docker ps -q)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)
docker volume rm $(docker volume ls -q)
docker compose up --build
将会出现以下错误:
Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@vitejs/plugin-react' imported from /app/node_modules/.vite-temp/vite.config.ts.timestamp-1733299382139-6e1c72bf771df.mjs
将缺少的依赖项添加回
package.json
并运行 npm install
再次构建并运行容器:
docker compose up --build
应用程序应该可以再次运行(与开始时“相同”),但错误仍然存在
我的猜测是您没有删除所有卷和图像。我在使用 Vue 时遇到了同样的问题,顺便说一句,它实际上应该在您重建时起作用,但事实并非如此。所以我只是删除了图像本身和卷。如果您输入
docker system prune -af --volumes
仍然存在卷,该命令不会完全删除所有图像、卷和容器。我必须输入 docker volume prune -a
才能删除所有卷。因此,您可以尝试像以前一样删除所有内容,但在再次构建之前,只需输入 docker volume ls
和 docker image ls
即可确定。