Docker 入口点不是 运行 作为 jupyterhub 上的根
Docker Entrypoint not running as root on jupyterhub
我们正在尝试 运行 docker 入口点作为我们的 jupyterhub 用于单用户服务器的 docker 图像中的根。我们需要 root 来添加一个主机,以便从 K8S 上的 jupyterhub 运行ning 上的单个用户 jupyter notebook 服务器中访问内部 git 注册表。
我们已经尝试将域添加到 docker 图像中的 /etc/hosts
文件,该图像由我们的 jupyterhub 在 docker-入口点脚本(代码可以在底部看到)。
但是,当我们尝试添加主机时,权限被拒绝。
打印输出还显示了原因:
在本地,第一个 whoami 显示 root
,正如我们预期的那样。
然而,在我们的 jupyterhub(在 K8s 上 运行ning)的 pod 中启动的 jupyter notebook 上,第一个打印输出已经显示 jovyan
.
直接在Dockerfile的entrypoint中打印出whoami也是一样的效果:
ENTRYPOINT ["sh", "-c", "echo $(whoami)"]
这意味着它是整个入口点,不会以 root 身份执行,但用户会以某种方式预先切换。
我们可以阻止这种行为还是有好的解决方法?
感谢任何帮助,提前致谢!
PS:
此外,当我们尝试在 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 ""
我们添加了空的 CMD 来覆盖 jupyter base-notebook 的 CMD
我的-entrypoint.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 的已知主机,使它们可用于那里的部署。
Link: https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#kube-dns
选择:
正如我们计划无论如何都授予用户 sudo 访问权限(没有太大风险,因为容器只是暂时存在),GRANT_SUDO 配置已经解决了这个问题。如果授予 sudo,入口点也将是 运行 作为 root。在脚本中更改为 jovyan 可能仍然是个好主意。
您可以通过以下方式设置 jupyterhub 的 GRANT_SUDO 设置:
如果您不想授予用户 sudo 访问权限,这对您来说仍然是一个可行的解决方案,因为您可以再次在脚本中删除 jovyan 的 sudo 权限。不过我还没有尝试过,因为在我们的场景中不需要它。
希望这对某人有所帮助。
我们正在尝试 运行 docker 入口点作为我们的 jupyterhub 用于单用户服务器的 docker 图像中的根。我们需要 root 来添加一个主机,以便从 K8S 上的 jupyterhub 运行ning 上的单个用户 jupyter notebook 服务器中访问内部 git 注册表。
我们已经尝试将域添加到 docker 图像中的 /etc/hosts
文件,该图像由我们的 jupyterhub 在 docker-入口点脚本(代码可以在底部看到)。
但是,当我们尝试添加主机时,权限被拒绝。 打印输出还显示了原因:
在本地,第一个 whoami 显示 root
,正如我们预期的那样。
然而,在我们的 jupyterhub(在 K8s 上 运行ning)的 pod 中启动的 jupyter notebook 上,第一个打印输出已经显示 jovyan
.
直接在Dockerfile的entrypoint中打印出whoami也是一样的效果:
ENTRYPOINT ["sh", "-c", "echo $(whoami)"]
这意味着它是整个入口点,不会以 root 身份执行,但用户会以某种方式预先切换。
我们可以阻止这种行为还是有好的解决方法?
感谢任何帮助,提前致谢!
PS:
此外,当我们尝试在 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 ""
我们添加了空的 CMD 来覆盖 jupyter base-notebook 的 CMD
我的-entrypoint.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 的已知主机,使它们可用于那里的部署。
Link: https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#kube-dns
选择:
正如我们计划无论如何都授予用户 sudo 访问权限(没有太大风险,因为容器只是暂时存在),GRANT_SUDO 配置已经解决了这个问题。如果授予 sudo,入口点也将是 运行 作为 root。在脚本中更改为 jovyan 可能仍然是个好主意。
您可以通过以下方式设置 jupyterhub 的 GRANT_SUDO 设置:
如果您不想授予用户 sudo 访问权限,这对您来说仍然是一个可行的解决方案,因为您可以再次在脚本中删除 jovyan 的 sudo 权限。不过我还没有尝试过,因为在我们的场景中不需要它。
希望这对某人有所帮助。