[英]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.