本文主要接收怎么通过
Dockerfile
的EntryPoint
做到,容器启动后的登录用户不是root
,而是用户通过docker run
参数指定的用户名和组名
本文的背景
这篇文章源自我上周工作中遇到的一个问题,我在k8s
中通过docker
启动jupyterlab
服务,但是发现每次docker
每次启动容器后的用户都默认是root
,这不利于权限控制和用户管理。
所以,我就想:是否控制用户启动容器后的登录用户呢? 周末在家好好学习了下怎么通过Dockerfile
对镜像进行定制,并通过EntryPoint
指令完成了上诉的功能,现分享给大家,希望对大家有帮助。
问题分析
如果你对docker
相关技术比较熟悉的化,你应该首先会想到docker run --users
或者在Dockerfile
中通过USER
指令来完成,但这两种方式都有个缺陷:就是我必须提前创建好用户和用户组。
如果你docker
的使用还有上层应用的化,那倒还好,你可以提前创建好用户和用户组,或者容器启动后手动切换到其他用户。
但是,如果我仅仅想通过docker run
的方式启动,启动后便自动完成创建和切换的工作呢?例如我就是通过docker
启动notebook
(一种基于web
的交互式编程服务),我想用户在notebook terminal
中登录的用户是自己而不都是root
。
了解docker
的同学应该知道,docker
是定制镜像,一般是先编写Dockerfile
,然后build
成镜像,最后基于这个镜像通过docker run
启动容器。
所以,现在问题关键就是:怎么通过docker run
后面跟一些参数传入用户名和组名,然后容器启动的时候,能够得到指定的用户名和组名,完成用户和组的创建,并切换到此用户?
CMD和ENTRYPOINT指令
Dockerfile
是通过一系列的指令,从某个基础镜像出发,加上自己定制的功能,完成定制镜像的工作。下面的代码就是一个简单的例子,它基于nginx
镜像进行扩展,添加一个html
文件,然后启动nginx
服务。
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>'