Почему при установке нового пакета npm мне нужно запустить «docker-compose down», а затем «docker-compose up --build»? - PullRequest
0 голосов
/ 31 октября 2018

Разве 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"]

И наш файл 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:

Из того, что я могу сказать, docker-compose down должен удалить том node_modules, потому что он создается docker-compose up.

Существует ли какое-либо кэширование, которое препятствует обновлению package.json, если только docker-compose --build не используется для явного перестроения образа Docker?

1 Ответ

0 голосов
/ 31 октября 2018

При текущей настройке во время сборки образа вы запускаете npm install, который создает и заполняет папку node_modules внутри образа.

Когда вы запускаете контейнер из этого образа, с вашим текущим файлом docker-compose.yml, docker создает новый том со случайным именем, копирует содержимое из папки node_modules изображения в эти новые тома и монтирует том на папка node_modules.

Ваше обновление в package.json будет видно внутри контейнера, потому что вы монтируете свою текущую папку как / usr / src / app (это скрывает версию, упакованную в образе).

Вы не упомянули, как работает npm install после обновления файла package.json. Я предполагаю, что вы запускаете его прямо на хосте. Если все правильно, это ваша проблема: она не будет работать, потому что ваша папка node_modules связана с томом докера, а не с вашей локальной папкой. Вам нужно запустить npm install внутри контейнера, выполнив что-то вроде docker-compose exec web npm install.

...