繁体   English   中英

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

[英]Docker Compose node_modules in container empty after file change

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

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

一切似乎都正常。 node_modules安装和nodemon启动应用。 在我的node_modules容器中,我有一个具有所有依赖项的node_modules文件夹。 在我的主机上,创建了一个空的node_modules (我不确定是否可以预期)。

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

我究竟做错了什么?

我的文件夹结构如下所示

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

泊坞窗,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文件夹(在主机上)中看到文件。

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

  • npm install在主机上npm install ,并创建一个可以供容器使用并引用主机node_modules文件夹的卷。
  • 在映像/容器构建过程中使用npm install这可能会给开发设置带来npm i因为每次您重新启动容器时(如果您更改了一些文件)它将安装npm i

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM