apt-get
в Debian-подобных системах обычно нужно запускать с правами root.В Dockerfile вы можете просто переключать идентификаторы пользователей с помощью директивы USER
;это обычно по умолчанию работает от имени пользователя root.Вы можете переключать учетные записи пользователей столько раз, сколько захотите;но обычно все вещи типа «установки» сначала делают, а потом меняют только идентификаторы пользователей.
(я бы не стал настраивать такие параметры, как «имя пользователя без полномочий root» или «домашний каталог»: это внутренниек контейнеру, и немного легче рассматривать их как фиксированные, вы почти никогда не видите их вне контейнера и в той степени, в которой такие вещи, как docker run -v
могут взаимодействовать с ними, намного проще, если они исправленызначения.)
Так что я мог бы переписать этот Dockerfile следующим образом:
FROM ubuntu:16.04
# Do this in one apt-get step for efficiency; and in the
# same Docker layer to avoid the APT cache getting out of
# date.
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get upgrade -f \
&& DEBIAN_FRONTEND=noninteractive apt-get install \
--no-install-recommends --assume-yes \
curl lsb lsb-core
# Set up the local user directory and copy the application in
# (still as root)
WORKDIR /lg
COPY . ./
# Now set up the non-root user
RUN user add -m -d /lg lg
USER lg
# Default thing to run when running the container
CMD ["/lg/lg"]
В общем случае вам не следует устанавливать su
или sudo
в образе.Оба имеют не интуитивное поведение, когда работают неинтерактивно (например, в Dockerfile).В необычном случае, когда вам нужно docker exec
, чтобы получить оболочку в работающем контейнере, вы можете так же легко добавить опцию -u root
, чтобы стать тем пользователем, которого вы хотите.