我正在尝试通过 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/