Docker Entrypoint не работает от имени пользователя root на jupyterhub - PullRequest
0 голосов
/ 29 октября 2018

Мы пытаемся запустить точку входа докера от имени пользователя root в образе докера, который используется нашим jupyterhub для однопользовательских серверов. Нам нужен root, чтобы добавить хост для доступа к внутреннему реестру git из однопользовательского сервера ноутбука jupyter на jupyterhub, работающем на K8S по его домену.

Мы уже пытались добавить домен в файл /etc/hosts в образе докера, который загружается для однопользовательских серверов нашим jupyterhub в сценарии docker-entrypoint (код можно увидеть внизу).

Однако мы получаем отказ в разрешении при попытке добавить хост. Распечатки также показывают, почему:

Локально, первый whoami показывает root, как мы и ожидали. На ноутбуке jupyter, запущенном в модуле нашего jupyterhub (работающем на K8s), первая распечатка уже показывает jovyan.

Тот же эффект можно увидеть при прямой печати whoami в точке входа в Dockerfile следующим образом:

ENTRYPOINT ["sh", "-c", "echo $(whoami)"]

Это означает, что это целая точка входа, которая не выполняется как root, но пользователь каким-то образом переключается заранее.

Можем ли мы предотвратить такое поведение или есть хороший обходной путь?

Любая помощь приветствуется, спасибо заранее! PS: Кроме того, когда мы пытаемся запустить exec su - "jovyan" в entrypoint-script на 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, чтобы перезаписать CMD базового ноутбука jupyter

my-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"

1 Ответ

0 голосов
/ 29 октября 2018

Чистящее средство:

Спасибо пользователю gitHub, который предоставил мне более чистое решение: Вы можете использовать kube-dns, чтобы добавить хосты к известным хостам Kubernetes, сделав их доступными для развертываний там.

Ссылка: https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#kube-dns

Альтернатива:

Поскольку мы планировали предоставить пользователям доступ к sudo независимо от того, что (без большого риска, поскольку контейнеры только временно там находятся), конфигурация GRANT_SUDO уже решает эту проблему. Если вы предоставите sudo, точка входа также будет запущена от имени пользователя root. Возможно, хорошей идеей будет переход на jovyan в сценарии.

Вы можете установить параметр GRANT_SUDO для jupyterhub с помощью:

Если вы не хотите предоставлять пользователю доступ к sudo, это все равно может быть для вас рабочим решением, так как вы можете снова удалить права sudo для jovyan в сценарии. Я не пробовал это, хотя это не требуется в нашем сценарии.

Надеюсь, это кому-нибудь поможет.

...