Docker中使用非root用户

发布时间:2023-12-03 15:30

在docker中运行一些程序时,有的程序会限制以root用户运行

1.查看本机的基础镜像

$ docker images
fedora_base 21 886a9840d56d 3 weeks ago 655 MB

记住上面的fedora_base 21,写Dockerfile时会用到。

2.Dockerfile 基本的语法是
使用 # 来注释 
FROM 指令告诉 Docker 使用哪个镜像作为基础:)

接着是维护者的信息:MAINTAINER Docker xxx
 
RUN 开头的指令会在创建中运行
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:
RUN <命令行命令>

1)<命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:
RUN [\"可执行文件\", \"参数1\", \"参数2\"]

RUN [\"./my_install.sh\", \"1\", \"10.0.0.3\"] 等价于 RUN ./my_install.sh 1 10.0.0.3

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM my_open_base
RUN yum install wget
RUN wget -O open.tar.gz \"http://10.0.0.3/open-1.0.0.tar.gz\" 
RUN tar -xvf open.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM my_open_base
RUN yum install wget \\
&&RUN wget -O open.tar.gz \"http://10.0.0.3/open-1.0.0.tar.gz\" \\
&& tar -xvf open.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
3.编写Dockerfile

$ cat Dockerfile

#This is a comment
FROM fedora_base:21
MAINTAINER Docker xxx 

RUN useradd -rm -d /home/tatooine -s /bin/bash -g root -G root -u 1001 tatooine
SHELL [\"/bin/bash\", \"-o\", \"pipefail\", \"-c\"]
RUN echo \'tatooine:123456\' | chpasswd
RUN echo \"tatooine ALL=(ALL) ALL\" > /etc/sudoers
RUN echo \'root:123456\' | chpasswd
RUN echo \"root ALL=(ALL) ALL\" > /etc/sudoers
USER tatooine
WORKDIR /home/tatooine

注意1:
FROM fedora_base:21是以我本机的fedora_base:21这个镜像作为基础镜像。
useradd选项(请参阅:)man useradd

要设置用户密码,请添加-p \"$(tatooine passwd -1 123456)\"到useradd命令。

或者,将以下几行添加到您的Dockerfile:

SHELL [\"/bin/bash\", \"-o\", \"pipefail\", \"-c\"]
RUN echo \'tatooine:123456\' | chpasswd

第一个shell指令是确保-o pipefail先启用该选项,然后再RUN添加管道。

对非root用户提升权限
要对非root用户(tatooine)提升权限以便使用yum功能,使用如下语句

RUN echo \"tatooine ALL=(ALL) ALL\" > /etc/sudoers

注意2:dockerfile中以添加用户和添加密码应该放到USER tatooine之前执行,在USER tatooine之前,是以root用户执行的,USER tatooine之后,没有root权限,无法正确执行。

4.执行

编写完成 Dockerfile 后可以使用 docker build 来生成镜像
将Dockerfile放入一个单独的目录,执行如下语句:

$ sudo docker build -t=\"fedora/open:v1\" .

其中 -t 标记来添加 tag,指定新的镜像的用户信息。“.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。

注意:一个镜像不能超过127层.这里Dockerfile没有使用&& 符号连接命令,所以创建一个多层的docker镜像

5.保存镜像为文件

如果要将镜像保存为本地文件,可以使用Docker save命令。命令格式:
docker save -o 要保存的文件名 要保存的镜像

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora/open v1 10c9cc1f1491 38 minutes ago 655 MB
fedora_base 21 886a9840d56d 3 weeks ago 655 MB

$ docker save -o fedora_open.tar fedora/open:v1

6.从文件载入镜像

从文件载入镜像可以使用Docker load命令。
命令格式:
docker load --input 文件
或者
docker load < 文件名
此时会导入镜像以及相关的元数据信息等

$ docker load --input fedora_open.tar 

 

 

 

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号