使用docker-compose处理节点模块

时间:2018-02-21 13:39:37

标签: node.js docker npm docker-compose

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

  1. 每个容器中的node_modules的完全安装在初始构建时通过每个服务的Dockerfile进行
  2. 在初始加载后缓存节点模块 - 即功能,以便在package.json发生更改时仅安装npm
  3. 安装npm模块有一个明确的方法 - 无论是需要重建还是有更简单的方法
  4. 现在,每当我npm install --save some-module并随后运行docker-compose builddocker-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
    

1 个答案:

答案 0 :(得分:0)

看起来这一行可能会覆盖您的node_modules目录:

# Bundle app source
COPY . .

如果您在运行npm install之前在主机上运行docker build来创建映像,则主机上的node_modules目录将被复制到容器中。

我想解决此问题的方法是仅复制单个代码目录和文件,例如:

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

如果你有很多文件和目录,这会很麻烦,所以另一种方法是将node_modules添加到你的.dockerignore文件中。这种方式在构建期间被Docker忽略。