文件更改后,容器中的Docker Compose node_modules为空

时间:2019-04-04 11:53:50

标签: node.js docker docker-compose

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

因此,我在docker-compose.yml中使用了两个卷。一个用于我的项目源,另一个用于图像中的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"]

project / package.json

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您可以使用以下两种解决方案中的任何一种:

  • npm install在主机上,并创建一个容器可以使用并引用主机node_modules文件夹的卷。
  • 在图像/容器的构建过程中使用npm install-这对于开发设置可能是一件痛苦的事情,因为每次您重新启动容器时(如果您更改了一些文件),npm i都会使用。