为什么当我安装新的 npm 包时,我必须先运行“docker-compose down”,然后再运行“docker-compose up --build”?

Mar*_*ira 2 node.js npm node-modules docker docker-compose

应该docker-compose up --build不够?

这是我们的 Dockerfile:

FROM node:8.12.0-alpine

# Set app directory
WORKDIR /usr/src/app

# Install git in order to allow installing
# npm packages from Github
RUN set -xe \
    && apk add --no-cache git

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install

# Bundle app source
COPY . .

ENV NODE_ENV development

EXPOSE 8080

CMD ["npm","start"]
Run Code Online (Sandbox Code Playgroud)

还有我们的 docker-compose 文件:

version: '3'
services:

  web:
    build: .
    ports:
      - 8080:8080
    environment:
      MONGODB_URI: mongodb://admin:app@mongo:27017/app?authSource=admin
    volumes:
      - .:/usr/src/app
      # More info on the node_modules volume at:
      # http://jdlm.info/articles/2016/03/06/lessons-building-node-app-docker.html
      # under "The node_modules Volume Trick"
      - /usr/src/app/node_modules
    # Run nodemon with legacy watch
    # https://github.com/remy/nodemon#application-isnt-restarting
    # Ignore public/ because generating documentation programatically
    # on startup was causing an infinite loop
    command: ./node_modules/.bin/nodemon --legacy-watch --inspect=0.0.0.0:5858 --ignore public/
    depends_on:
      - mongo

  mongo:
    image: mongo:4.0
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: app
    volumes:
      # Using a named volume because windows doesn't deal well with mounting local folders
      - app-api-mongodb-storage:/data/db

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: admin
      ME_CONFIG_MONGODB_ADMINPASSWORD: app
    depends_on:
      - mongo

volumes:
  # Database named module has to be declared globally
  app-api-mongodb-storage:
Run Code Online (Sandbox Code Playgroud)

据我所知,docker-compose down应该删除 node_modules 卷,因为它是由docker-compose up.

是否有某种缓存阻止 package.json 被刷新,除非docker-compose --build用于显式重建 Docker 映像?

lbn*_*dev 5

使用您当前的设置,在映像构建时您正在运行npm install,它会在映像内创建并填充 node_modules 文件夹。

当您从此映像启动容器时,使用当前的 docker-compose.yml 文件,docker 创建一个新的随机命名的卷,将映像的 node_modules 文件夹中的内容复制到这个新卷中,并将该卷挂载到 node_modules 文件夹中。

您对 package.json 的更新将在容器中可见,因为您将当前文件夹安装为 /usr/src/app(这会隐藏图像中打包的版本)。

您没有提到npm install更新 package.json 文件后的运行方式。我的猜测是您直接在主机上运行它。如果正确,这就是您的问题:它不起作用,因为您的 node_modules 文件夹绑定到 docker 卷,而不是您的本地文件夹。您需要npm install在容器内运行,通过执行类似docker-compose exec web npm install.