Docker Entrypoint не работает как root на jupyterhub

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

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

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

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

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

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, чтобы перезаписать 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"

person z1kanda    schedule 29.10.2018    source источник


Ответы (1)


Более чистое решение:

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

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

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

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

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

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

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

person z1kanda    schedule 29.10.2018