Я работаю на сервере Express, написанном на TypeScript.Поток проекта заключается в том, что у меня есть скрипт сборки npm, который берет файлы проекта в папке src и компилирует их в папку dist.Обе эти папки живут в корневом каталоге.Проект работает, но при попытке переместить все в Docker, хотя я монтирую том и встроенные файлы (каталог dist) находится в контейнере, изменения не отражаются на хосте.(Я использую Windows + VirtualBox для Docker)
Я сослался на это и это вопросы.Я вижу, что их сценарий такой же, но их решения, похоже, не работают для меня.Я удостоверился, что использую подобные методы, упомянутые в ответах на них, они, кажется, не работают.
Структура каталогов проекта:
├── Backend
│ ├── src/
│ │ ├── controllers/
│ │ ├── models/
│ │ ├── routes/
│ │ ├── services/
│ │ ├── index.ts
│ │ └── server.ts
│ ├── dist/ (Created upon compilation)
│ │ ├── controllers/
│ │ ├── data/ (Created upon starting the server)
│ │ ├── models/
│ │ ├── routes/
│ │ ├── services/
│ │ ├── index.js
│ │ └── server.js
│ ├── Dockerfile
│ ├── package.json
│ ├── tsconfig.json
│ ├── tslint.json
│ └── .env
├── Frontend/ (This part is an independent application)
├── docker-compose.yml
└── README.md
Когда сервер запускается, он создаеткаталог в %proj_root%/Backend/dist
с именем data
, который используется для ввода данных приложению через текстовые файлы.Компиляция работает хорошо, как видно из команд ls, которые я поместил в Dockerfile, но изменения, сделанные внутри контейнера (создание каталога dist), не отражаются на хосте.На хосте каталог dist пуст, что приводит к сбою сервера из-за отсутствия файла server.js.
Вот мой docker-compose.yml:
version: "3"
services:
backend:
build:
context: ./Backend/
volumes:
- ./Backend/dist:/app/dist
- /app/node_modules
- ./Backend:/app
frontend:
build:
context: ./Frontend
ports:
- "3001:8080"
volumes:
- /app/node_modules
- ./Frontend:/app
Вот файл Dockerfileдля службы Backend:
FROM node:8
WORKDIR /app
COPY ./package.json .
RUN npm install
COPY . . # Copying everything to enable standalone usage
RUN ls # Logging before tsc build
RUN npm run build
RUN ls /app/dist # Logging after tsc build. All the built files are visible.
CMD ["npm", "run", "start"]
После запуска docker-compose up
папка dist должна быть создана в контейнере (/app/dist
) и отображаться на хосте как %proj_root%/Backend/dist
Я понимаюЯ мог бы создать скрипт, который компилирует TS, а затем запускает docker-compose, но для меня это выглядит хакерским подходом.Есть ли лучшее решение?