我有一个非常简单的目录结构:
docker-compose.yml
- backend/
- Dockerfile-node
- package.json
- my_backend.js
这是docker-compose文件。在我尝试向docker-compose文件添加卷之前,API会正常工作。当我取消注释这些行时,我的应用程序将无法运行,因为它无法找到我已安装的依赖项。我在本地进行更改时,是否无法在docker-compose中设置卷来更新容器上的文件?我知道如何使用docker run
命令来实现这一点,但是在这里看起来不可能
version: "3.5"
services:
node:
build:
context: ./backend
dockerfile: Dockerfile-node
ports:
- 5808:5808
# volumes:
# - ${PWD}/backend:/backend
这是Dockerfile-node的内容:
FROM node:8
WORKDIR /backend
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 5808
CMD ["npm", "start"]
这是package.json的开始部分:
"scripts" : {
"start" : "nodemon my_backend.js"
}
答案 0 :(得分:1)
之所以会发生这种情况,是因为在装入卷时替换了容器中已安装的 node_modules 目录。
我建议您更改目录结构,以将应用程序代码放在单独的目录中,例如app/
:
docker-compose.yml
backend/
- Dockerfile-node
- package.json
- app/
- my_backend.js
然后可以仅将app/
目录作为卷挂载:
version: "3.5"
services:
node:
build:
context: ./backend
dockerfile: Dockerfile-node
ports:
- 5808:5808
volumes:
- ${PWD}/backend/app:/backend/app
这样,您的 node_modules 会从app/
开始安装目录,因此,在卷安装时不会被删除。
您现在可以更新 package.json 脚本:
"scripts" : {
"start" : "nodemon app/my_backend.js"
}
...,您还需要更新应用程序代码中使用的所有导入路径,以反映新的目录结构。
我希望这会有所帮助。