Как установить узел в Dockerfile?

Я хочу установить node v18 на AWS Linux

Пререквизит

  • У меня есть Django и фронтенд React системы. Поэтому я хочу использовать node при установке фронтенда.
  • Если я использую make Dockerfile, такой как From node:18, он работает, но я хочу использовать FROM python:3.9 для работы django.
  • Не является ли хорошей идеей поместить Djang и React в один контейнер?

Теперь мой файл docker выглядит следующим образом.

FROM python:3.9
ENV PYTHONUNBUFFERED 1
RUN apt-get update 
WORKDIR /usr/src/app
RUN apt-get install -y npm
RUN pip install pipenv
WORKDIR /usr/src/app/frontend_react
RUN npm install --force
RUN node -v //version 12 is installed
RUN dnf module install nodejs:18/common
RUN node -v
RUN npm run build

На самом деле нет dnf.

Как я могу это сделать?

Если вы можете использовать готовые образы Docker Hub, то это намного проще. Я бы вообще избегал попыток поместить компоненты с разными вариантами использования, системами сборки и временем выполнения в один образ, если это возможно.

В конкретном случае приложения Django с фронтендом React, вы можете компилировать фронтенд в статические файлы, которые вы затем обслуживаете непосредственно через Django. В этом случае вам не нужен Node для запуска приложения, просто пока статические файлы существуют, Django может их обслуживать. Функция Docker multi-stage build позволит вам собрать front-end с помощью node образа, а затем COPY встроить его в ваше приложение. Типичный пример может выглядеть следующим образом:

FROM node:18 AS react
WORKDIR /app
COPY frontend_react/package*.json ./
RUN npm ci
COPY fronend_react/ ./
RUN npm build

FROM python:3.9
ENV PYTHONUNBUFFERED 1
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY ./ ./
COPY --from=react /app/dist/ frontend_react/dist/
EXPOSE 8000
CMD ["./manage.py", "runserver", "0.0.0.0:8000"]

Первая половина должна выглядеть как обычная сборка образа React, за исключением того, что в ней нет CMD. Вторая половина должна выглядеть как обычная сборка образа Django, плюс строка COPY --from=react для получения собранного приложения с первого этапа сборки. Нам не нужны node или npm в конечном образе, только статические файлы, и поэтому мы не вызываем менеджер пакетов, чтобы попытаться установить их.

Вернуться на верх