docker-compose卷中的异常行为

时间:2019-06-12 20:52:58

标签: node.js docker docker-compose

我有一个非常简单的目录结构:

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"
 }

1 个答案:

答案 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"
}

...,您还需要更新应用程序代码中使用的所有导入路径,以反映新的目录结构。

我希望这会有所帮助。