В большинстве случаев я использую Docker с томами.Но сейчас я впервые пытаюсь использовать крепления, и они работают не так, как я ожидал.Возможно, я что-то упускаю или, возможно, не совсем понимаю, как они работают.
Давайте рассмотрим этот пример.У меня есть приложение React, созданное с create-react-app
, и оно будет работать с бэкэндом Rails на основе базы данных MySQL.
Моя структура каталогов:
App
├── docker
│ ├── api
│ │ └── Dockerfile
│ └── fe
│ ├── Dockerfile
│ ├── package.json
│ ├── package-lock.json
│ ├── public
│ ├── README.md
│ └── src
├── docker-compose.yml
Я начал с создания файла docker-compose.yml
следующим образом:
version: "3.7"
services:
web:
build: ./docker/fe/.
ports: ["80:3000"]
volumes:
- type: bind
source: "./docker/fe"
target: "/app"
Как видите, я отображаюкаталог ./docker/fe
, где находится интерфейс React, до /app
.
Внутри ./docker/fe
находится файл Docker:
FROM node:8
WORKDIR /app
RUN npm install
CMD ["npm","start"]
Я ожидал, что это сработает, потому что файлы моего приложениявсе внутри /app
, сопоставлены с ./docker/fe
.По крайней мере, я думал, что они будут!Но когда я запускаю команду docker-compose up --build
в командной строке, я получаю ошибку сборки, потому что она говорит, что в каталоге /app
нет файла package.json
.
С другой стороны, когда я используюэта другая версия Dockerfile
FROM node:8
WORKDIR /app
ADD package.json .
ADD package-lock.json .
RUN npm install
ADD . .
CMD ["npm","start"]
эта проблема не произойдет.Он найдет файл package.json
и правильно соберет приложение.Но он не запустится!
Дело в том, что он скажет, что не может найти скрипты React.И это не удивительно, поскольку, когда он закончен, в ./docker/fe
нет каталога node_modules
, как можно было бы ожидать после запуска npm install
.
Я в замешательстве.
Я что-то упускаю из-за монтирования bind?
Зачем мне ДОБАВИТЬ package.json
в WORKDIR, если этот каталог связан с каталогом хоста, где находится этот файлуже есть?
Почему у меня нет каталога node_modules
внутри ./docker/fe
после npm install
?