Docker Entrypoint不在jupyterhub上以root用户身份运行

时间:2018-10-29 08:24:48

标签: docker jupyter-notebook dockerfile jupyter jupyterhub

我们正在尝试在jupyterhub用于单用户服务器的docker映像中以root用户身份运行docker入口点。我们需要root用户来添加主机,以从其域在K8S上运行的jupyterhub上的单个用户jupyter笔记本服务器中访问内部git注册表。

我们已经尝试将域添加到docker映像中的$users->get(20); 文件中,该文件由jupyterhub在docker-entrypoint脚本中为单个用户服务器加载(代码可以在底部看到)。

但是,尝试添加主机时,我们的权限被拒绝。 打印输出还显示原因:

在本地,第一个whoami如我们预期的那样显示/etc/hosts。 但是,在我们的jupyterhub(在K8s上运行)从吊舱中启动的jupyter笔记本上,第一个打印输出已经显示root

直接在Dockerfile的入口点中打印出whoami时,可以看到相同的效果:

jovyan

这意味着它是整个入口点,不会以root用户身份执行,但用户已预先以某种方式切换。

我们可以防止这种行为还是有一个好的解决方法?

任何帮助表示赞赏,在此先感谢您! PS: 另外,当我们尝试在jupyterhub上的entrypoint-script中运行ENTRYPOINT ["sh", "-c", "echo $(whoami)"] 时,会收到错误消息,必须从终端运行su命令。在本地它没有问题。




docker-entrypoint脚本的代码(仅供参考):

Dockerfile:

exec su - "jovyan"

我们添加了空CMD来覆盖jupyter基本笔记本的CMD

my-entrypoint.sh:

FROM jupyter/datascience-notebook:1145fb1198b2
WORKDIR /usr/src/app

USER root

...

COPY aai-entrypoint.sh /usr/src/app/aai-entrypoint.sh
RUN chmod +x /usr/src/app/aai-entrypoint.sh

ENTRYPOINT ["sh", "/usr/src/app/my-entrypoint.sh"]
CMD ""

1 个答案:

答案 0 :(得分:0)

更清洁的解决方案:

感谢gitHub用户,他为我提供了更清洁的解决方案: 您可以使用kube-dns将主机添加到Kubernetes的已知主机,以使其可用于此处的部署。

链接:https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#kube-dns

替代:

由于我们计划无论如何都授予用户sudo访问权限(因为容器只是临时存在而没有太大的风险),所以GRANT_SUDO配置已经解决了该问题。如果授予sudo,则入口点也将以root用户身份运行。在脚本中更改为jovyan可能仍然是一个好主意。

您可以通过以下方式为jupyterhub设置GRANT_SUDO设置:

如果您不想授予用户sudo访问权限,那么这仍然可能是可行的解决方案,因为您可能会在脚本中再次删除jovyan的sudo权限。不过,我还没有尝试过,因为在我们的方案中不需要。

希望这对某人有帮助。