Docker挂载NodeJS应用卷数据不持久、宿主修改未同步、node_modules缺失问题求助
问题原因&修复方案
问题1:宿主机代码修改后容器内未同步
根本原因是路径配置不统一:
- Dockerfile中创建的用户名为
dockuser,应用工作目录为/home/dockuser/src - docker-compose中挂载的本地目录对应容器路径为
/home/dockeruser/src,多了一个字母e,两者指向完全不同的目录,修改自然不会同步到应用运行的实际目录。
问题2:容器内看不到构建阶段生成的node_modules
有两个关联错误:
- npm install执行目录和工作目录不一致:你在Dockerfile中先把package.json拷贝到容器根目录执行
npm install,生成的node_modules存放在容器根路径,后续切换到/home/dockuser/src作为工作目录,自然找不到对应的依赖包。 - 宿主机目录覆盖容器内文件:你注释了node_modules的匿名卷挂载,直接把宿主机项目根目录挂载到容器工作目录时,会直接覆盖容器内该路径下的所有内容,就算node_modules生成在正确位置也会被宿主机空的node_modules目录(如果宿主机没装依赖)覆盖。
具体修复步骤
- 统一路径配置
把docker-compose中nodeServer的volumes挂载路径修正为和Dockerfile一致,同时取消node_modules匿名卷的注释:
volumes: - .:/home/dockuser/src - node_modules:/home/dockuser/src/node_modules
同时删掉docker-compose中重复写的第二行restart: unless-stopped,避免冗余。
- 修正Dockerfile依赖安装逻辑
调整Dockerfile的执行顺序,先创建工作目录再执行依赖安装:
FROM node:14.4-alpine3.11 RUN apk add --no-cache python g++ make ENV NODE_ENV=development RUN apk update && apk add bash RUN addgroup -g 1010 -S docker && \ adduser -u 1010 -S dockuser -G docker # 提前创建工作目录并分配权限 RUN mkdir -p /home/dockuser/src && chown -R dockuser:docker /home/dockuser/src WORKDIR /home/dockuser/src USER dockuser # 拷贝依赖清单到工作目录后执行安装 COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"] RUN npm install --production # 最后拷贝全量代码 COPY . /home/dockuser/src EXPOSE 3000 8745 CMD ["/bin/sh", "entrypoint.sh"]
- 重新构建启动
修改完成后执行以下命令即可:
docker-compose build --no-cache docker-compose up
内容的提问来源于stack exchange,提问作者R0bertinski
相关产品推荐
相关产品推荐

