docker与gosu

Posted yongzhouunknown

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker与gosu相关的知识,希望对你有一定的参考价值。

1.容器中不要使用root账号

gosu是个工具,用来提升指定账号的权限,作用与sudo命令类似,而docker中使用gosu的起源来自安全问题;

docker容器中运行的进程,如果以root身份运行的会有安全隐患,该进程拥有容器内的全部权限,更可怕的是如果有数据卷映射到宿主机,那么通过该容器就能操作宿主机的文件夹了,一旦该容器的进程有漏洞被外部利用后果是很严重的。

因此,容器内使用非root账号运行进程才是安全的方式,这也是我们在制作镜像时要注意的地方。

这里有篇文章也推荐在容器中使用最小权限的账号:https://snyk.io/blog/10-docker-image-security-best-practices/ ,如下图:

技术图片

2.在镜像中创建非root账号

既然不能用root账号,那就要创建其他账号来运行进程了,以redis官方镜像的Dockerfile为例,来看看如何创建账号,如下图,地址是:https://github.com/docker-library/redis/blob/6845f6d4940f94c50a9f1bf16e07058d0fe4bc4f/5.0/Dockerfile :

技术图片

可见redis官方镜像使用groupadd和useradd创建了名为redis的组合账号,接下来就是用redis账号来启动服务了,理论上应该是以下套路:

(1).用USER redis将账号切换到redis;

(2).在docker-entrypoint.sh执行的时候已经是redis身份了,如果遇到权限问题,例如一些文件只有root账号有读、写、执行权限,用sudo xxx命令来执行即可;

但事实并非如此!

在Dockerfile脚本中未发现USER redis命令,这意味着执行docker-entrypoint.sh文件的身份是root;

其次,在docker-entrypoint.sh中没有发现su - redis命令,也没有sudo命令;

这是怎么回事呢?难道容器内的redis服务是用root账号启动的?

2.确认redis服务的启动账号

还是自己动手来证实一下吧,我的环境信息如下:

操作系统:CentOS Linux release 7.6.1810
Docker: 1.13.1

操作步骤如下:

(1).启动一个redis容器:

docker run --name myredis -idt redis

(2).进入容器:

docker exec -it myredis /bin/bash

(3).在容器内,先更新apt:

apt-get update

(4).安装ps命令:

apt-get install procps

(5).执行命令ps -ef查看redis服务,结果如下:

root@122c2df16bbb:/data# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
redis         1      0  0 09:22 ?        00:00:01 redis-server *:6379
root        287      0  0 09:36 ?        00:00:00 /bin/bash
root        293    287  0 09:39 ?        00:00:00 ps -ef

上面的结果展示了两个关键信息:

第一,redis服务是redis账号启动的,并非root;

第二,redis服务的PID等于1,这很重要,宿主机执行docker stop命令时,该进程可以收到SIGTERM信号量,于是redis应用可以做一些退出前的准备工作,例如保存变量、退出循环等,也就是优雅停机(Gracefully Stopping);

现在我们已经证实了redis服务并非root账号启动,而且该服务进程在容器内还是一号进程,但是我们在Dockerfile和docker-entrypoint.sh脚本中都没有发现切换到redis账号的命令,也没有sudo和su,这是怎么回事呢?

 

以上是关于docker与gosu的主要内容,如果未能解决你的问题,请参考以下文章

以宿主机用户身份运行Docker容器

有没有办法使用 Gosu 无限期地使用光标滚动地图

如何在docker中为postgresql创建postgis扩展?

Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段

markdown [Docker] Docker片段列表和命令#linux #docker #snippets

markdown docker-compose片段