Как установить узел в 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
в конечном образе, только статические файлы, и поэтому мы не вызываем менеджер пакетов, чтобы попытаться установить их.