docker-compose именованный том перезаписывается после сохраненного изменения? - PullRequest
0 голосов
/ 21 октября 2019

Я не могу воспроизвести это на своем компьютере, но это постоянно происходит на компьютере коллеги, работающем с той же кодовой базой вместе с текущей версией Docker Compose (1.24.1, сборка 4667896b), оба из нас на OS X.

Фон: По сути, у меня есть монтирование папки backend к исходному коду контейнера, расположенному в /var/www/app. Однако, поскольку у меня не установлено node_modules на хосте, я монтирую его, используя be_modules. Это дает эффект (когда он работает) использования установленных в образе модулей node_modules, эффективно монтируя «поверх» исходного кода в /var/www/app.

Проблема: Выполняется docker-compose up или docker-compose run backend sh (для отладки) правильно показывает node_modules, полученный из изображения. Все они отображаются очень хорошо, а дата / время в папке node_modules при запуске ls - это каждый раз, когда создается том. Все хорошо.

На хосте создан пустой каталог node_modules, что является нормой, поскольку он монтируется в контейнер и поэтому на хосте создается соответствующая папка.

Однако, как только мой коллега внесет несколько изменений в исходный код, эти изменения синхронизируются с контейнером (как и должно быть), однако node_modules становится пустой папкой в ​​контейнере! Более того, дата и время в каталоге меняется на время создания образа!

Что мы пробовали: Перезапуск Docker, удаление всех образов, контейнеров, томов и запуск новой сборки.

С чего бы это случилось? Я подозреваю, что это либо ошибка Docker / Compose, поскольку я не могу воспроизвести с точно таким же кодом, либо есть некоторая тонкость, которую я упускаю. Мне кажется, что проблема заключается в том, что когда файл изменяется, Docker перемонтирует весь каталог в контейнере, и это перезаписывает монтирование be_modules с этим пустым каталогом, поскольку временная метка междупустой каталог хоста и пустой контейнер контейнера совпадают.

Docker-compose.yml:

version: "3.7"

backend:
    build: ./backend
    env_file: 
      - ./.env
    volumes:
      - ./backend:/var/www/app
      - be_modules:/var/www/app/node_modules
    ports:
      - 5000:5000
    environment:
      - PORT=5000
    command:
      'npm start'
    depends_on:
      - db
volumes:
  fe_modules:
  be_modules:

Backend Dockerfile:

FROM node:12.12.0

WORKDIR '/var/www/app'
# 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 --no-optional
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...