1

我是 docker 和 linux 的新手。
我正在使用 Windows 10 并获得了一个 github 示例来使用 Centos 和 nginx 创建一个容器。
我需要使用 root 用户来更改 nginx.config。
在 Kitematic 中,我单击 Exec 以在容器中获取一个 bash shell,然后我尝试了 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

4 回答 4

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 上都有很多示例。

于 2018-12-27T22:34:24.003 回答
2

您应该阅读 Docker关于构建和运行自定义镜像的官方教程。我很少在容器中的交互式 shell 中工作。相反,我设置了一个Dockerfile构建一个可以自主运行的镜像,并像任何其他软件一样迭代构建和运行它。在这种情况下su并且sudo不是很有用,因为容器很少有控制终端或人工操作员输入密码(为此通常没有任何用户的有效密码)。

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

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

我见过的一个例外是,如果您有一个容器,无论出于何种原因,它需要以 root 身份进行初始工作,然后放弃特权来完成其真正的工作。(特别是官方的 Consul 图像会这样做。)它使用专用的轻量级工具,如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选项重新创建它。(不过,这不是我发现自己想要经常改变的。)

于 2018-12-27T22:55:34.183 回答
1

我在我的本地启动了容器,结果你不需要sudo你可以用sudebian 映像默认提供的

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}

于 2018-12-27T22:37:41.033 回答
0

感谢大家。

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

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

我试过了

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

它什么也没做,它停留在以下状态: 这里

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

于 2018-12-28T12:54:54.290 回答