如何从容器使用root用户?

时间:2018-12-27 20:59:20

标签: docker nginx containers kitematic

我是docker和linux的新手。
我使用的是Windows 10,并有一个github示例,使用Centos和nginx创建了一个容器。
我需要使用root用户来更改nginx.config。
在Kitematic中,我单击Exec以在容器中获得bash外壳,然后尝试了sudo su –作为打击:

  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: 

然后,在Windows的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 shell开始。我可以获得以下操作系统信息:

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 :(得分:3)

您的方法通常是错误的。您应该在容器外部准备文件,然后让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上都有很多示例。

答案 1 :(得分:2)

您应该阅读Docker的official tutorial on building and running custom images。我很少在容器中的交互式shell中工作;相反,我设置了一个Dockerfile来构建可以自主运行的映像,并像其他任何软件一样迭代构建和运行该映像。在这种情况下,susudo并不是很有用,因为容器很少具有控制终端或人工操作员来输入密码(因此,对于任何容器,通常都没有有效的密码)用户)。

相反,如果我想以非root用户身份在容器中工作,我的Dockerfile需要设置该用户:

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

我看到的一个例外是,如果您有一个容器,无论出于何种原因,该容器都需要以root用户身份进行初始工作,然后放弃特权才能进行其实际工作。 (特别是official Consul image这样做。)它使用专用的轻量级工具,例如gosusu-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 rundocker exec都使用一个-u参数来指示用户以其身份运行。如果您以错误的用户身份启动了容器,请删除它,然后使用正确的docker run -u选项重新创建它。 (不过,这不是我发现自己想要经常改变的人。)

答案 2 :(得分:1)

我在本地启动了容器,结果发现您不需要sudo即可使用默认情况下在debian映像上附带的su进行操作

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}

复制它

答案 3 :(得分:0)

谢谢大家。

我认为最好是用Centos设置一个virtualbox并与nginx一起玩。 然后,当我准备好并拥有正确的nginx.config时,可以使用Dockerfile复制我的配置文件。

VM太慢了,我希望可以在容器中的交互式shell中学习和玩游戏而不是使用VM。你有什么比virtualbox更好的主意吗?

我尝试了

var multer = require('multer')
var MulterAzureStorage = require('multer-azure-storage')
var upload = multer({
storage: new MulterAzureStorage({azureStorageConnectionString:
'DefaultEndpointsProtocol=https;AccountName=mystorageaccount;
AccountKey=mykey;EndpointSuffix=core.windows.net',
containerName: 'photos',
containerSecurity: 'blob',
fileName : ?//how to use this options properties
})
}  )

它什么也没做,而是保持以下状态: here

相同的命令适用于debian映像,但不适用于centos。