Node.js 使用docker compose处理节点模块

Node.js 使用docker compose处理节点模块,node.js,docker,npm,docker-compose,Node.js,Docker,Npm,Docker Compose,我正在使用docker compose构建一组连接的节点服务,无法找到处理节点模块的最佳方法。以下是完美世界中应该发生的事情: 在初始构建时,通过每个服务的Dockerfile在每个容器中完全安装node_模块 节点模块在初始加载(即功能)后缓存,因此npm仅在package.json发生更改时安装 安装npm模块有一个明确的方法——不管是需要重建还是有更简单的方法 现在,每当我npminstall--save一些模块,然后运行docker compose build或docker compos

我正在使用docker compose构建一组连接的节点服务,无法找到处理节点模块的最佳方法。以下是完美世界中应该发生的事情:

  • 在初始构建时,通过每个服务的Dockerfile在每个容器中完全安装node_模块
  • 节点模块在初始加载(即功能)后缓存,因此npm仅在package.json发生更改时安装
  • 安装npm模块有一个明确的方法——不管是需要重建还是有更简单的方法
  • 现在,每当我npm
    install--save一些模块
    ,然后运行
    docker compose build
    docker compose up--build
    ,我最终发现模块实际上没有安装

    这是一个Dockerfiles文件

    FROM node:latest
    
    # Create app directory
    WORKDIR /home/app/api-gateway
    
    # Intall app dependencies (and cache if package.json is unchanged)
    COPY package.json .
    RUN npm install
    
    # Bundle app source
    COPY . .
    
    # Run the start command
    CMD [ "npm", "dev" ]
    
    这是docker compose.myl的

    version: '3'
    
    services:
    
      users-db:
        container_name: users-db
        build: ./users-db
        ports:
          - '27018:27017'
        healthcheck:
          test: exit 0'
    
      api-gateway:
        container_name: api-gateway
        build: ./api-gateway
        command: npm run dev
        volumes:
          - './api-gateway:/home/app/api-gateway'
          - /home/app/api-gateway/node_modules
        ports:
          - '3000:3000'
        depends_on:
          - users-db
        links:
          - users-db
    

    这行代码可能正在覆盖您的
    节点\u模块
    目录:

    # Bundle app source
    COPY . .
    
    如果在运行
    docker build
    创建映像之前在主机上运行
    npm install
    ,则主机上有一个
    node\u modules
    目录正在复制到容器中

    我想做的是只复制单个代码目录和文件来解决这个问题,例如:

    # Copy each directory and file
    COPY ./src ./src
    COPY ./index.js ./index.js
    

    如果您有很多文件和目录,这可能会很麻烦,因此另一种方法是将
    node\u模块
    添加到
    .dockergnore
    文件中。这样,Docker在构建过程中就会忽略它。

    您在哪里运行
    安装--保存一些模块
    ?在你的机器上?您希望该模块安装在映像或主机中吗?现在,我将通过进入/api网关并在那里运行,在本地计算机上安装该模块。我希望在映像中安装模块(这样在运行容器时就可以访问)