Должен ли я докеризировать приложение 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"]

Не пытайтесь записывать файлы внутри контейнера; вместо этого используйте отдельный контейнер базы данных для персистентности. Не передавайте идентификатор пользователя хоста в качестве аргумента сборки. Не задавайте пароль для пользователя и не пытайтесь настроить интерактивный вход. Не создавайте домашний каталог; он не будет использоваться.

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