Должен ли я докеризировать приложение django как не root?
Нужно ли запускать приложение Django в докере под пользователем root? Если да, то как я могу установить не root пользователя для Django? Потому что в node.js приложение должно иметь USER:node, что является лучшей практикой.
Пример кода с официальной страницы docker, который не включает non-root:
FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
В целом это хорошая практика.
В начале вашего Dockerfile, прежде чем COPY
ничего не вводить, создайте пользователя. Он не должен иметь никаких особых свойств и не должен соответствовать какому-либо определенному идентификатору пользователя хоста. Единственная особая причина сделать это раньше - избежать повторения при пересборке.
В конце вашего Dockerfile, после выполнения всех шагов сборки, только после этого переключитесь USER
на нового пользователя. Код и все установленные библиотеки будут принадлежать пользователю root; и это хорошо, потому что это означает, что приложение не сможет случайно перезаписать код приложения.
FROM python:3
# Create the non-root user. Doing this before any COPY means it won't
# be repeated on rebuild, for marginal savings in space and rebuild time.
# The user can have any name and any uid; it does not need to match any
# particular host system where the image might run.
RUN adduser --system --no-create-home someuser
# Install the application as in the question (still as root).
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
# Explain how to run the container. Only switch to the non-root user now.
EXPOSE 8000
USER someuser
CMD ["./main.py"]
Не пытайтесь записывать файлы внутри контейнера; вместо этого используйте отдельный контейнер базы данных для персистентности. Не передавайте идентификатор пользователя хоста в качестве аргумента сборки. Не задавайте пароль для пользователя и не пытайтесь настроить интерактивный вход. Не создавайте домашний каталог; он не будет использоваться.