node.js - 文件更改后 Docker Compose 容器中的 node_modules 为空

标签 node.js docker docker-compose

我正在尝试通过 Docker Compose 在 Docker 容器中运行 Node.js。 node_modules 应在镜像中创建,并且源代码应从主机同步。

因此,我在 docker-compose.yml 中使用了 2 个卷。一个用于我的项目源,另一个用于图像中的 node_modules

一切似乎都正常。 node_modules 已安装,并且 nodemon 启动应用程序。在我的 docker 容器中,我有一个包含所有依赖项的 node_modules 文件夹。在我的主机上创建了一个空的 node_modules (我不确定这是否是预期的)。

但是,当我更改项目中的文件时。 nodemon 进程检测到文件更改并重新启动应用程序。现在应用程序崩溃了,因为它找不到模块。 Docker 容器中的 node_modules 文件夹现在是空的。

我做错了什么?

我的文件夹结构如下所示

/
├── docker-compose.yml
├── project/
│   ├── package.json
│   ├── Dockerfile

docker-compose.yml

version: '3'
services:
  app:
    build: ./project
    volumes:
      - ./project/:/app/
      - /app/node_modules/

项目/Dockerfile

# base image
FROM node:9

ENV APP_ROOT /app

# set working directory
RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT

# install and cache app dependencies
COPY package.json $APP_ROOT
COPY package-lock.json $APP_ROOT
RUN npm install

# add app
COPY . $APP_ROOT

# start app
CMD ["npm", "run", "start"]

项目/package.json

...
"scripts": {
    "start": "nodemon index.js"
}
...

最佳答案

映射卷可以使文件可供容器使用,而不是相反。

您可以通过在 CMD 中运行“npm install”来解决您的问题。您可以通过运行 npm install && npm run start 的“启动”脚本(例如 start.sh)来实现此目的。该脚本应该使用普通的 COPY 命令复制到容器中并且可执行。

启动容器时,您应该会在(主机上)node_modules 文件夹中看到文件。

关于node.js - 文件更改后 Docker Compose 容器中的 node_modules 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55515379/

相关文章:

使用免费公共(public)代理下载 node.js 文件

docker - 如何在 docker-compose 中使用多个图像标签

docker - 像卷一样将绑定(bind)挂载添加到 Dockerfile

docker - 如何使用 aws 驱动程序和已存在的 key 对创建 docker-machine

java - 从 Docker 容器中的 maven Quarkus 项目的资源文件夹中读取 txt 文件

docker - 在文件 './docker-compose.yml'中,volume必须是一个映射,而不是数组

docker - 如何使用 docker-compose 更新现有图像?

javascript - 观看 './**/*.js' 会导致 CPU 使用率过高

node.js - 在 mongodb 中查找 key 何时未知

node.js - 重定向在 ExpressJS 中不起作用