#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)
, и это сработало.