Проблема с монорепозиторием, общей папкой и Docker

Вопрос или проблема

Я настроил проект монорепозитория с 3 пакетами

./project1

./project2

./project3

./shared

Каждый проект имеет свой собственный Dockerfile и файл Docker Compose

Я использовал npm link, чтобы использовать общую папку и добавить это в каждый package.json :

depedencies:{ "@my-shared/types": "file:../shared" }

И затем я могу импортировать так :

import { stuff } from '@my-shared/types';

Например, если я запущу команду “npm run dev” в моем project1 (который является Node API), всё работает отлично! Если бы не одно… я использую Docker. Если я запущу команду “docker compose up” в папке ./project1, я получу ошибку, потому что не могу найти свою общую папку.

Это мой Dockerfile :

FROM node:lts-slim

ENV TZ=Europe/Paris

ADD . /app/
WORKDIR /app

RUN npm install

EXPOSE 3001

CMD npm run dev

А вот мой docker-compose :

services:
  mongo:
    image: mongo
    container_name: mongodb
    restart: always
    volumes: 
      - dbdata:/data/db
    networks:
      - api-net
    command: mongod --quiet --logpath /dev/null 
    environment:
      - TZ=Europe/Paris
  
  my-api:
    build: .
    image: my-api 
    restart: always 
    ports:
      - 3001:3001
    volumes: 
      - .:/app  
    depends_on:
      - mongo
    networks:
      - api-net
    environment:
      - TZ=Europe/Paris

networks:
  api-net:
    driver: bridge

volumes:
  dbdata:

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

Спасибо за вашу помощь

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

my-api:
    build: .
    image: my-api 
    restart: always 
    ports:
      - 3001:3001
    volumes: 
      - .:/app  
      - ./yourSharedFolderPath 
    depends_on:
      - mongo
    networks:
      - api-net
    environment:
      - TZ=Europe/Paris

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что при работе с Docker, конфигурация volumes должна включать все необходимые директории для вашего приложения, чтобы обеспечить доступ ко всем зависимостям, включая общий каталог.

Для решения вашей проблемы, вам необходимо убедиться, что папка ./shared добавлена в секцию volumes вашего сервиса my-api в файле docker-compose.yml. Вот как можно внести необходимые изменения:

  1. Откройте файл docker-compose.yml.
  2. В интервале my-api добавьте путь к общей папке ./shared в секции volumes.

Ваш изменённый файл docker-compose.yml должен выглядеть следующим образом:

services:
  mongo:
    image: mongo
    container_name: mongodb
    restart: always
    volumes: 
      - dbdata:/data/db
    networks:
      - api-net
    command: mongod --quiet --logpath /dev/null 
    environment:
      - TZ=Europe/Paris

  my-api:
    build: .
    image: my-api 
    restart: always 
    ports:
      - 3001:3001
    volumes: 
      - .:/app  
      - ./shared:/app/shared   # Добавлено монтирование общей папки
    depends_on:
      - mongo
    networks:
      - api-net
    environment:
      - TZ=Europe/Paris

networks:
  api-net:
    driver: bridge

volumes:
  dbdata:

Обратите внимание на следующие моменты:

  • В строке - ./shared:/app/shared вы монтируете папку ./shared из вашего локального окружения в контейнер Docker по адресу /app/shared. Таким образом, контейнер будет видеть все файлы и папки в директории shared.
  • Убедитесь, что путь к общей папке ./shared указывается корректно относительно места запуска вашего docker-compose up.

После внесения этих изменений, попробуйте снова запустить команду docker compose up из каталога ./project1. Ваши проекты должны успешно находить общие модули и работать корректно в окружении Docker.

Если у вас возникнут дополнительные вопросы или потребуется помощь с другой конфигурацией, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...