Я не могу воспроизвести это на своем компьютере, но это постоянно происходит на компьютере коллеги, работающем с той же кодовой базой вместе с текущей версией 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" ]