Владелец файла при наличии пользователя, не являющегося пользователем root

#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}
 

Есть две вещи, в которых я не уверен, нужны ли они, но я видел их в нескольких статьях. Не мог бы кто-нибудь, пожалуйста, объяснить, почему/если бы они мне понадобились.

  1. --gid 1000 и --uid 1000
  2. 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