发布时间: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