Как использовать пользователя root из контейнера? - PullRequest
0 голосов
/ 27 декабря 2018

Я новичок в докере и Linux.
Я использую Windows 10 и получил пример github для создания контейнера с Centos и nginx.
Мне нужно использовать пользователя root для изменения nginx.config.
В Kitematic я нажал на Exec, чтобы получить оболочку bash в контейнере, и попробовал sudo su - as blow:

  sh-4.2$ sudo su –  
  sh: sudo: command not found  

Итак, я попытался установить sudo с помощью следующей команды:

sh-4.2$ yum install sudo -y  
Loaded plugins: fastestmirror, ovl  
ovl: Error while doing RPMdb copy-up:  
[Errno 13] Permission denied: '/var/lib/rpm/Installtid'  
You need to be root to perform this command.  

Потом я запустил su -, но я не знаю пароля!Как я могу установить пароль?

sh-4.2$ su -  
Password: 

Затем из powershell на моих окнах я также попытался:

PS C:\Containers\nginx-container> docker exec -u 0 -it 9e8f5e7d5013 bash 

, но он показывает, что скрипт работает, и ничего не произошло, и я отменил его с помощью Ctrl + C послечас.

Некоторая дополнительная информация:

Вот как я создал контейнер:

PS C:\Containers\nginx-container> s2i build https://github.com/sclorg/nginx-container.git --context->dir=examples/1.12/test-app/ centos/nginx-112-centos7 nginx-sample-app

Из оболочки bash в контейнере.Я могу получить информацию об ОС следующим образом:

sh-4.2$ cat /etc/os-release  
NAME="CentOS Linux"  
VERSION="7 (Core)"  
ID="centos"  
ID_LIKE="rhel fedora"  
VERSION_ID="7"  
PRETTY_NAME="CentOS Linux 7 (Core)"  
ANSI_COLOR="0;31"  
CPE_NAME="cpe:/o:centos:centos:7"  
HOME_URL="https://www.centos.org/"  
BUG_REPORT_URL="https://bugs.centos.org/"  

CENTOS_MANTISBT_PROJECT="CentOS-7"  
CENTOS_MANTISBT_PROJECT_VERSION="7"  
REDHAT_SUPPORT_PRODUCT="centos"  
REDHAT_SUPPORT_PRODUCT_VERSION="7"  

Буду очень признателен, если вы поможете мне решить эти проблемы.
Спасибо!

Ответы [ 4 ]

0 голосов
/ 28 декабря 2018

Спасибо всем.

Я думаю, что лучше настроить виртуальную коробку с Centos и играть с nginx.Затем, когда я буду готов и у меня будет правильный nginx.config, я могу использовать Dockerfile для копирования моего конфигурационного файла.

ВМ работает так медленно, и я надеялся, что смогу работать в интерактивных оболочках в контейнерах, чтобы изучить ииграть вместо использования виртуальной машины.У вас есть идея лучше, чем virtualbox?

Я пытался

  docker run -dit nginx-sample-app bash  
  docker exec -u root -it 9e8f5e7d5013 bash  

И он ничего не сделал, он остается в следующем состоянии: здесь

те же команды работали с образом Debian, но не с Centos.

0 голосов
/ 28 декабря 2018

Я запустил контейнер на своем локальном компьютере и оказалось, что вам не нужно sudo вы можете сделать это с su, который поставляется по умолчанию для образа debian

docker run -dit centos bash
docker exec -it 9e82ff936d28 sh
su

также вы можете попробоватьвыполнив следующее, по умолчанию вы получаете root:

docker run -dit centos bash
docker exec -it 9e82ff936d28 bash

никогда, вы не могли бы создать конфигурацию Nginx вне контейнера и просто скопировать ее, используя docker container copy {file_path} {container_id}:{path_inside_container}

0 голосов
/ 28 декабря 2018

Вам следует прочитать официальное руководство Docker по по созданию и запуску пользовательских образов .Я редко работаю в интерактивных оболочках в контейнерах;вместо этого я настроил Dockerfile, который создает образ, который может работать автономно, и повторяет его создание и запуск, как и любой другой программный продукт.В этом контексте su и sudo не очень полезны, потому что контейнер редко имеет управляющий терминал или оператора-человека для ввода пароля (и в этом отношении обычно не имеет действительного пароля для любого пользователя).

Вместо этого, если я хочу выполнять работу в контейнере как пользователь без полномочий root, мой Dockerfile должен настроить этого пользователя:

FROM ubuntu:18.04
WORKDIR /app
COPY ...
RUN useradd -r -d /app myapp
USER myapp
CMD ["/app/myapp"]

Единственное исключение, которое я видел, это еслиу вас есть контейнер, который по какой-либо причине должен выполнить начальную работу от имени пользователя root, а затем отбросить привилегии для выполнения своей реальной работы.(В частности, это делает официальный консул .) Для этого используется специальный облегченный инструмент, такой как gosu или su-exec .Типичная настройка Dockerfile может выглядеть так:

# Dockerfile
FROM alpine:3.8
RUN addgroup myapp \
 && adduser -S -G myapp myapp
RUN apk add su-exec
WORKDIR /app
COPY . ./
ENTRYPOINT ["/app/docker-entrypoint.sh"]
CMD ["/app/myapp"]
#!/bin/sh
# docker-entrypoint.sh

# Initially launches as root
/app/do-initial-setup

# Switches to non-root user to run real app
su-exec myapp:myapp "$@"

Оба docker run и docker exec принимают аргумент -u, указывающий, что пользователь должен работать от имени.Если вы запустили контейнер как неправильный пользователь, удалите его и создайте заново с правильным параметром docker run -u.(Однако я не хочу часто меняться.)

0 голосов
/ 28 декабря 2018

Ваш подход, как правило, неверен.Вы должны подготовить файл вне контейнера, а затем позволить самому Docker изменить его.

Есть несколько способов добиться этого.

  1. Вы можете смонтировать файл во время запуска:

    docker run -v /your/host/path/to/config.cfg:/etc/nginx/config.cfg ...

  2. Вы можете скопировать файл в контейнер во времясборка контейнера (внутри Dockerfile):

    FROM base-name COPY config.cfg /etc/nginx/

  3. Вы можете применить патч к скрипту конфигурации (еще раз, Dockerfile):

    FROM base-name ADD config.cfg.diff /etc/nginx/ RUN ["patch", "-N", "/etc/nginx/config.cfg", "--input=/etc/nginx/config.cfg.diff"]

Для каждого метода существует множество примеров StackOverflow.

...