Docker中使用非root用户

在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 <xxx@xxx.cn>
 
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_openvpn_base
RUN yum install wget
RUN wget -O openvpn.tar.gz "http://10.0.0.3/openvpn-1.0.0.tar.gz" 
RUN tar -xvf openvpn.tar.gz

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

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

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

$ cat Dockerfile

#This is a comment
FROM fedora_base:21
MAINTAINER Docker xxx <xxx@xxx.cn>

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/openvpn:v1" .

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

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

5.保存镜像为文件

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

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

$ docker save -o fedora_openvpn.tar fedora/openvpn:v1

6.从文件载入镜像

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

$ docker load --input fedora_openvpn.tar 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值