Docker入口点未在jupyterhub上以root身份运行

Docker入口点未在jupyterhub上以root身份运行,docker,jupyter-notebook,dockerfile,jupyter,jupyterhub,Docker,Jupyter Notebook,Dockerfile,Jupyter,Jupyterhub,我们正试图在jupyterhub用于单用户服务器的docker映像中以根用户身份运行docker入口点。我们需要root添加一个主机,以便从运行在K8S上的jupyterhub上的单用户jupyter笔记本服务器中访问内部git注册表 我们已经尝试将域添加到docker映像中的/etc/hosts文件中,该文件由我们的jupyterhub在docker入口点脚本中为单用户服务器加载(代码可以在底部看到) 但是,在尝试添加主机时,我们的权限被拒绝。 打印输出还显示了原因: 在本地,第一个whoam

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

我们已经尝试将域添加到docker映像中的
/etc/hosts
文件中,该文件由我们的jupyterhub在docker入口点脚本中为单用户服务器加载(代码可以在底部看到)

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

在本地,第一个whoami显示
root
,正如我们所期望的那样。 然而,在jupyter笔记本上,我们的jupyterhub(在K8s上运行)在一个pod中启动了jupyter笔记本,第一个打印输出已经显示了
jovyan

在Dockerfile的入口点直接打印whoami时,可以看到相同的效果,如下所示:

ENTRYPOINT ["sh", "-c", "echo $(whoami)"]
这意味着它是整个入口点,它不会以root用户身份执行,但用户会以某种方式提前切换

我们是否可以防止这种行为,或者是否有一个好的解决办法

感谢您的帮助,提前谢谢! 附言: 此外,当我们试图在jupyterhub上的入口点脚本中运行
exec su-“jovyan”
时,我们得到了一个错误,即su命令必须从终端运行。在本地,它可以毫无问题地工作。





docker入口点脚本代码(仅供参考):

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 ""
#!/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"
我们添加了空CMD以覆盖jupyter base笔记本的CMD

我的入口点。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 ""
#!/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的已知主机中,使其可用于部署

链接:

备选方案:

正如我们计划授予用户sudo访问权限,不管发生什么(容器只是暂时存在的,没有大的风险),GRANT_sudo配置已经解决了这个问题。如果授予sudo,入口点也将作为root运行。在剧本中改用乔维安可能仍然是个好主意

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

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

希望这对别人有帮助