Закрепите проект React-Django, в котором интерфейс обслуживается из Django

#reactjs #django #docker #docker-compose

Вопрос:

Я обслуживаю приложение react из Django и пытаюсь развернуть его с помощью docker-compose up -d --build .

Мой каталог проектов выглядит следующим образом:

 root ├──project (django) | ├──frontend/ # react project is here | ├──project/ | ├──static/ | ├──Dockerfile //Dockerfile for backend image | ├──entrypoint.sh | ├──manage.py | ├──requirements.txt └──docker-compose.yaml   

Вот мой текущий сценарий развертывания:

 # pull the official base image FROM python:3.8.12-bullseye  # set work directory WORKDIR /usr/src/app  # set environment variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1  # install dependencies RUN apt-get update COPY /requirements.txt /usr/src/app RUN pip install -r requirements.txt  # set work directory WORKDIR ~/usr/src/app COPY package.json ./ COPY package-lock.json ./ RUN npm install --silent RUN npm install react-scripts@3.4.1 -g --silent RUN npm run dev  # set work directory WORKDIR /usr/src/app  # copy project COPY . /usr/src/app/    # run entrypoint.sh ENTRYPOINT ["/usr/src/app/entrypoint.sh"]  

Ошибка, которую я получаю

 > => ERROR [12/18] COPY package.json ./  > 0.0s => ERROR [13/18] COPY package-lock.json ./ 0.0s ------ > > [12/18] COPY package.json ./: > ------ > ------ > > [13/18] COPY package-lock.json ./: > ------ failed to compute cache key: "/package-lock.json" not found: not found  

Ответ №1:

Я отредактировал ваш док-файл, попробуйте, если это сработает:

 # pull the official base image FROM python:3.8.12-bullseye  RUN apt-get update  COPY . ./usr/src/app  WORKDIR /usr/src/app  # set environment variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1  # install python dependencies RUN pip install -r requirements.txt  WORKDIR /usr/src/app/frontend RUN npm install --silent RUN npm install react-scripts@3.4.1 -g --silent RUN npm run dev  # run entrypoint.sh ENTRYPOINT ["/usr/src/app/entrypoint.sh"]  

Комментарии:

1. Это не сработает, потому что команда WORKDIR задает внутренний рабочий каталог внутри образа. Мое предложение состояло бы в том, чтобы переместить COPY . /usr/src/app/ наверх (вы все равно копируете все.

2. @NicoGriffioen Да, конечно, ты прав. Это было бы проще!

Ответ №2:

Проблема в том , что package.json и package-lock.json присутствуют не в каталоге, в котором вы работаете docker build , а (вероятно) в вашем подкаталоге интерфейса.

Изменив эти две строки на:

 COPY frontend/package.json ./ COPY frontend/package-lock.json ./  

должно сработать. Но еще лучше, так как вы все равно все копируете, вы можете переместить это наверх:

 # pull the official base image FROM python:3.8.12-bullseye  # set work directory WORKDIR /usr/src/app  # copy project COPY . .  # set environment variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1  # install dependencies RUN apt-get update RUN apt-get update  amp;amp; apt-get install -y curl  amp;amp; curl --silent --location https://deb.nodesource.com/setup_12.x | bash -  amp;amp; apt-get install -y nodejs  amp;amp; npm install --silent amp;amp; npm install react-scripts@3.4.1 -g --silent RUN pip install -r requirements.txt  # set work directory WORKDIR /usr/src/app/frontend RUN npm install --silent RUN npm install react-scripts@3.4.1 -g --silent RUN npm run dev  # set work directory WORKDIR /usr/src/app  # run entrypoint.sh ENTRYPOINT ["/usr/src/app/entrypoint.sh"]  

Я не уверен, каковы ваши потребности, но для производственной среды я бы предложил разделить интерфейс и приложение Django на разные контейнеры. Серверные приложения имеют совсем другие потребности в масштабировании и оборудовании, чем интерфейсные приложения. Вы все еще можете упаковать его в одно приложение, например, с помощью Docker-compose.

Комментарии:

1. спасибо Нико за то, что нашел время для компиляции этого. И да, я согласен, что это должны быть разные контейнеры, спасибо за совет и напоминание. Я сделаю это в следующий раз. Сейчас я просто работаю над MVP. С другой стороны, я получаю следующую ошибку при запуске указанного вами скрипта ` => ОШИБКА [13/16] ЗАПУСК установки npm —без звука 0,6 с —— >> [13/16] ЗАПУСТИТЕ установку npm —молчание: #18 0.544 /bin/sh: 1: npm: не найден`

2. эй, чувак, у меня все получилось, возможно, обнови свой ответ, чтобы все могли его увидеть.

3. FROM python:3.8.12-bullseye WORKDIR /usr/src/app COPY . . ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 RUN apt-get update amp;amp; apt-get install -y curl amp;amp; curl --silent --location https://deb.nodesource.com/setup_12.x | bash - amp;amp; apt-get install -y nodejs amp;amp; npm install --silent amp;amp; npm install react-scripts@3.4.1 -g --silent RUN pip install -r requirements.txt ENTRYPOINT ["/usr/src/app/entrypoint.sh"]

4. а потом /usr/src/app/entrypoint.sh я добавил (cd frontend/src amp;amp; npm run dev) , и это сработало.