#docker #dockerfile
Вопрос:
Я настраиваю проект Django с помощью a Dockerfile
и задаюсь вопросом о правильном владельце, когда у пользователя нет root.
Моя Dockerfile
внешность выглядит так:
FROM python:3.7-slim
ENV DIR=/data
ENV USER=files
RUN groupadd --gid 1000 -r ${USER}
amp;amp; useradd --uid 1000 --no-log-init -r -g ${USER} ${USER}
WORKDIR ${DIR}
COPY poetry.lock pyproject.toml ${DIR}/
RUN poetry install --no-interaction --no-ansi --no-root
ADD . ${DIR}
RUN chown -R ${USER}:${USER} ${DIR}
USER ${USER}
Есть две вещи, в которых я не уверен, нужны ли они, но я видел их в нескольких статьях. Не мог бы кто-нибудь, пожалуйста, объяснить, почему/если бы они мне понадобились.
--gid 1000
и--uid 1000
RUN chown -R ${USER}:${USER} ${DIR}
Ответ №1:
Тебе не нужно ни то, ни другое. Есть еще ряд других вещей, которые также можно очистить в этом файле Dockerfile.
Во chown
-первых: вы, вероятно, хотите, чтобы исходный код вашего приложения принадлежал root и был доступен для чтения во всем мире, но не для записи в мире (обычно режим 0644 или 0755). Это предотвращает потенциальную проблему безопасности, когда ошибка в вашем коде случайно перезаписывает часть исходного кода или статических ресурсов вашего приложения.
Открытый вопрос здесь заключается в том, нужно ли вам хранить постоянные данные в своем контейнере. Постарайтесь избежать этого, если сможете, храня данные где-нибудь, например, во внешней базе данных; это поможет вам обновить образ и поможет, если вам нужно запустить несколько реплик контейнера. Если вам это нужно, храните данные где-нибудь отдельно от вашего основного каталога приложений, а chown
этот единственный каталог-для пользователя, не являющегося пользователем root.
Пользователь, не являющийся пользователем root, может иметь любой идентификатор пользователя и группы. Он не обязательно должен соответствовать какому-либо конкретному пользователю хоста, и действительно, пытаться сопоставить его не рекомендуется (я на Mac, поэтому мой uid равен 501; нужно ли мне перестраивать образ Docker?).
Если бы я обновлял это, я бы также избегал двух ENV
переменных; эти каталоги и имена пользователей, вероятно, будут исправлены на изображении, вам не нужно часто ссылаться на них, и изменение их во время выполнения не будет иметь эффекта.
Это изменит файл Dockerfile на:
FROM python:3.7-slim
# with a fixed username; without a fixed uid
RUN useradd --no-log-init -r files
# with a fixed path; then use . everywhere afterwards
WORKDIR /data
COPY poetry.lock pyproject.toml ./
RUN poetry install --no-interaction --no-ansi --no-root
# prefer COPY to ADD
COPY . ./
# no need to RUN chown; leave the files owned by root
# if you need a local data directory only
# RUN mkdir data amp;amp; chown files data
# specify the runtime user and default CMD
USER files
CMD ["./main.py"]
Если у вас есть каталог данных для записи, и вам нужно, чтобы он был смонтированным с привязкой каталогом хоста, и он принадлежит какому-либо пользователю, вы можете указать идентификатор пользователя при запуске контейнера.
docker run -u $(id -u):$(id -g) -v $PWD/data:/data/data myapp