Работа над пользователем в dockerfile и установка пакетов для него запрещены - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу установить пакеты в dockefile как пользователь в / home / user.

FROM ubuntu:16.04

ENV user lg

RUN useradd -m -d /home/${user} ${user} \
 && chown -R ${user} /home/${user}

USER ${user}

WORKDIR /home/${user}

RUN apt-get update

RUN apt-get -y install curl

RUN apt-get -y install lsb-core

RUN apt-get -y install lsb

RUN apt-get -y upgrade -f

Docker выдает ошибку при выполнении apt-get update

E: Каталог списков / var / lib / apt / lists / part отсутствует.- Получить (13: разрешение отклонено) Команда '/ bin / sh -c apt-get update' вернула ненулевой код: 100

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

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, чтобы стать тем пользователем, которого вы хотите.

0 голосов
/ 22 ноября 2018

Это потому, что ваш lg пользователь просто не имеет необходимых разрешений.В этом случае не имеет значения, что Ubuntu докеризован.Это как в любом другом дистрибутиве Linux - вам нужны разрешения для выполнения определенных действий.Пример: если вы создадите нового пользователя в своей родной системе, я уверен, что команда apt-get install X вызовет точно такую ​​же ошибку, не так ли?

Чтобы установить что-либо, вам потребуется sudo для аутентификации от имени пользователя root.Это может быть достигнуто следующим образом:

FROM ubuntu:16.04

RUN apt-get update && \
    apt-get -y install sudo

ENV user lg

RUN useradd -m -d /home/${user} ${user} && \
    chown -R ${user} /home/${user} && \
    adduser ${user} sudo && \
    echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER ${user}

WORKDIR /home/${user}

RUN sudo apt-get -y install curl && \
    sudo apt-get -y install lsb-core && \
    sudo apt-get -y install lsb && \
    sudo apt-get -y upgrade -f

Небольшое объяснение:

  1. Сначала вам нужно установить пакет sudo
  2. Добавить пользователя в sudo
  3. И вам также нужно добавить NOPASSWD в файл sudoers (я сделал это для ВСЕХ, но вы можете легко установить его для конкретного пользователя).Без этого вы столкнетесь со следующей ошибкой: sudo: no tty present and no askpass program specified
  4. Теперь вы можете установить вещи с этим пользователем

Также попробуйте избегать многократного использования одной и той же инструкции Dockerfile (В вашем случае выимел избыточный 4х RUN).Каждая инструкция представляет собой отдельный слой в последующем образе сборки.Это известно Рекомендации Dockerfile .

Минимизация количества слоев В старых версиях Docker было важно, чтобы вы минимизировали количество слоев в изображениях, чтобы они былипроизводительный.Чтобы уменьшить это ограничение, были добавлены следующие функции:

В Docker 1.10 и выше только слои RUN, COPY, ADD создают слои.Другие инструкции создают временные промежуточные образы и не увеличивают размер сборки напрямую.

...