我正在开发一个 Node.js 后端项目,并使用 Docker 和 Docker Compose 进行设置。我的文件夹结构如下所示:
project-root/
│
├── server/
│ ├── Controllers/
│ ├── db/
│ ├── node_modules/
│ ├── Routers/
│ ├── server.js
│ ├── Dockerfile
│ ├── package.json
│ └── package-lock.json
├── docker-compose.yml
└── Client/
尽管在 docker-compose.yml 中使用卷将本地服务器文件夹映射到容器,但每次在 server.js 中进行更改时,我都需要重建 Docker 容器以使更改生效。我的期望是更改应该立即反映在正在运行的容器中,而无需重建,特别是因为我正在使用 nodemon 来监视文件更改。
docker-compose.yml:
version: '3.8'
services:
api:
build:
context: ./server
dockerfile: Dockerfile
volumes:
- ./server:/app
- /app/node_modules
ports:
- "5000:5000"
environment:
- NODE_ENV=development
command: npm start
Dockerfile
FROM node:16
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
包.json
{
"scripts": {
"start": "nodemon server.js"
}
}
我希望容器自动拾取 server.js 文件(和其他文件)中的更改,而无需重建。我怎样才能实现这个目标?我的音量设置有问题,还是我遗漏了其他内容?
尝试正确安装
- /app/node_modules
。通过使用 :
定义另一个路径,您会缺少主机或客户端。就像您对 - ./server:/app
所做的那样。
此外,为了节省“构建时间”,您可以尝试使用层,它允许您利用 docker 的缓存。
FROM node:16 AS dependencies
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
FROM dependencies AS sourcecode
COPY . .
FROM sourcecode AS startblock
CMD ["npm", "start"]
现金层不会被重建,除非它们发生了变化。