странное поведение из томов docker-compose - PullRequest
0 голосов
/ 12 июня 2019

У меня очень простая структура каталогов:

docker-compose.yml
    - backend/
          - Dockerfile-node
          - package.json
          - my_backend.js

Это файл docker-compose. API работает нормально, пока я не попытаюсь добавить том в файл docker-compose. Когда я раскомментирую эти строки, мое приложение не будет запускаться, так как оно говорит, что не может найти установленные мной зависимости. Разве невозможно настроить том в docker-compose, где файлы в контейнере обновляются, когда я делаю изменения локально? Я знаю, как этого добиться с помощью команды docker run, но здесь это не выглядит возможным

version: "3.5"
services:
    node:
        build:
             context: ./backend
             dockerfile: Dockerfile-node
        ports: 
             - 5808:5808
#       volumes:
#           - ${PWD}/backend:/backend

Вот содержимое Dockerfile-узла:

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 Ответ

1 голос
/ 13 июня 2019

Это происходит потому, что установленная директория 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"
}

... и вам также потребуется обновить любые пути импорта, используемые в коде вашего приложения, чтобы отразить новую структуру каталогов.

Надеюсь, это поможет.

...