我们正在尝试在我们的 jupyterhub 用于单用户服务器的 docker 映像中以 root 身份运行 docker 入口点。我们需要 root 来添加主机,以从其域在 K8S 上运行的 jupyterhub 上的单个用户 jupyter notebook 服务器中访问内部 git 注册表。
我们已经尝试将域添加到/etc/hosts
docker 映像中的文件中,该文件由我们的 jupyterhub 在 docker-entrypoint 脚本中为单用户服务器加载(代码可以在底部看到)。
但是,我们在尝试添加主机时获得了拒绝权限。打印输出还说明了原因:
在本地,root
正如我们预期的那样,第一个 whoami 显示。然而,在我们的 jupyterhub(在 K8s 上运行)在 pod 中启动的 jupyter notebook 上,第一个打印输出已经显示jovyan
.
直接在 Dockerfile 的入口点打印 whoami 可以看到同样的效果,如下所示:
ENTRYPOINT ["sh", "-c", "echo $(whoami)"]
这意味着它是整个入口点,不会以 root 身份执行,但用户会以某种方式事先切换。
我们可以防止这种行为还是有一个好的解决方法?
任何帮助表示赞赏,在此先感谢您!PS:此外,当我们尝试exec su - "jovyan"
在 jupyterhub 上的入口点脚本中运行时,我们收到错误,必须从终端运行 su 命令。在本地它可以正常工作。
docker-entrypoint 脚本代码(仅供参考):
Dockerfile:
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 ""
我们添加了空的 CMD 来覆盖 jupyter base-notebook 的 CMD
我的入口点.sh:
#!/bin/bash
echo $(whoami)
echo "xx.xxx.xxx our.domain.com" >> /etc/hosts
echo "test"
exec su - "jovyan"
echo $(whoami)
# to not overwrite the entrypoint of the jupyter/base-notebook
# see https://github.com/jupyter/docker-stacks/blob/master/base-notebook/Dockerfile
exec tini -g -- "start-notebook.sh"
清洁剂解决方案:
感谢 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 权限。不过,我还没有尝试过,因为在我们的场景中不需要它。
希望这可以帮助某人。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句