Как установить новые пакеты в контейнер Docker без полномочий root?

Я пытаюсь расширить док-контейнер для SOLR. Я просто хочу установить в него vim. Но когда я запускаю сборку докеров, она жалуется, что я не root.

Это DockerFile, который я расширяю: https://github.com/makuk66/docker-solr/blob/master/5.3/Dockerfile

И мой файл сборки таков:

FROM makuk66/docker-solr
MAINTAINER OCSCommerce Team <[email protected]>
RUN apt-get update
RUN apt-get --assume-yes install vim
COPY home/ocscommerce /etc/solr/home

Затем он выводит это:

192.168.99.100
localhost:solr$ docker build -t ocscommerce/solr .
Sending build context to Docker daemon 39.66 MB
Step 0 : FROM makuk66/docker-solr
 ---> 92be2fe79f15
Step 1 : MAINTAINER OCSCommerce Team <[email protected]>
 ---> Using cache
 ---> a3ac70e40324
Step 2 : RUN apt-get update
 ---> Running in c865716a2694
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

Есть ли способ установить пакет в этот контейнер? Или мне нужно скопировать исходный файл сборки с makuk66?


person Richard G    schedule 15.09.2015    source источник
comment
Итак, скажите мне, для чего вам нужно установить vim в контейнер? обычно это не требуется.   -  person BMW    schedule 15.09.2015
comment
ну, я часто вхожу в терминал, и мне нужно просмотреть файлы, если я исследую какую-то проблему.   -  person Richard G    schedule 15.09.2015
comment
Вам нужен vim для просмотра файлов журналов? Затем вы должны сопоставить внешний том с /var/log/solr или где они хранятся. Кроме того, это позволяет сохранять файлы журналов   -  person OneCricketeer    schedule 03.06.2016


Ответы (3)


В Dockerfile # L24 был изменен пользователь к solr. Таким образом, если вы используете образ в качестве базового образа с FROM, все команды в вашем собственном Dockerfile выполняются пользователем solr

Вы можете исправить это, создав Dockerfile с самого начала.

FROM    java:openjdk-8-jre
MAINTAINER  Martijn Koster "[email protected]"

ENV SOLR_VERSION 5.3.0
ENV SOLR solr-$SOLR_VERSION
ENV SOLR_USER solr

RUN export DEBIAN_FRONTEND=noninteractive && \
  apt-get update && \
  apt-get -y install lsof && \
  groupadd -r $SOLR_USER && \
  useradd -r -g $SOLR_USER $SOLR_USER && \
  mkdir -p /opt && \
  wget -nv --output-document=/opt/$SOLR.tgz http://www.us.apache.org/dist/lucene/solr/$SOLR_VERSION/$SOLR.tgz && \
  tar -C /opt --extract --file /opt/$SOLR.tgz && \
  rm /opt/$SOLR.tgz && \
  ln -s /opt/$SOLR /opt/solr && \
  mkdir -p /opt/solr/server/solr/lib && \
  chown -R $SOLR_USER:$SOLR_USER /opt/solr /opt/$SOLR

RUN apt-get --assume-yes install vim

EXPOSE 8983
WORKDIR /opt/solr
USER $SOLR_USER
CMD ["/bin/bash", "-c", "/opt/solr/bin/solr -f"]

Во-вторых, не копируйте коды в контейнер при сборке, использование опции -v будет более гибким.

COPY home/ocscommerce /etc/solr/home

Заменить на docker run команду -v home/ocscommerce:/etc/solr/home

person BMW    schedule 15.09.2015
comment
хорошо, я подозревал, что мне, возможно, придется скопировать файл изображения. Не беспокойтесь, спасибо за советы. - person Richard G; 15.09.2015

Переключитесь на пользователя root, затем вернитесь к исходному пользователю solr:

USER root

install/updates

USER solr
person user1338771    schedule 03.06.2016
comment
Не могли бы вы объяснить, что это должно делать? - person Michal; 06.02.2017
comment
Для меня просто введите эту строку в моем Dockerfile, которая расширяет другие, и я решаю проблему прямо в установочном пакете: «USER root». Только то ! - person darkomen; 02.03.2017
comment
Он изменяет пользователя на root, чтобы вы могли запускать привилегированные команды, такие как apt-get install. После этого он снова переключается на пользователя с именем solr, который кажется созданным из исходного образа, так что приложение внутри контейнера не должно запускаться с привилегиями root (что в целом является хорошей практикой). Это нужно только тогда, когда создатель базового образа заботится о безопасности. Потому что, когда он этого не делает, все работает с полными привилегиями root внутри контейнера, что является поведением докера по умолчанию. - person Lion; 10.03.2018

Предложение аналогично предыдущему ответу https://stackoverflow.com/a/37615312/2200690, откройте интерактивную оболочку как root, а затем установите ваши пакеты с помощью apt-get.

docker exec --user="root" -it <container_name> /bin/bash

установить пакет

apt-get install package
person Suketu Bhuta    schedule 11.02.2019