Кастомные Docker-образы

Важно

  • Не гарантируется стабильная работа приостановки Jupyter server при использовании кастомных образов.

  • Кастомный образ собирается на основе любого базового образа, используемого на платформе. Подробнее см. Образы, используемые на платформе ML Space.

Docker registry также используется для хранения кастомных Docker-образов. Кастомный образ собирается на основе любого базового образа с использованием необходимых пользователю зависимостей. Такие кастомные образы с предустановленными зависимостями применяются в модуле Environments для создания пользовательских окружений (Jupyter Server на основе кастомного образа).

Для создания кастомного образа необходимо:

  1. Подготовить Dockerfile на локальной машине

  2. Подготовить репозиторий для размещения образа

  3. Собрать образ и загрузить его в Docker registry

Dockerfile

Dockerfile — текстовый документ, который содержит все необходимые команды для сборки образа. В общем случае этот документ выглядит так:

FROM {PROD_REGISTRY}/base/jupyter-cuda10.1-tf2.2.0-gpu-mlspace:latest #базовый образ, на основе которого собирается кастомный
apt-get install mypackage #необходимые пакеты для установки

Важно

В базовые образы предустановлены основные библиотеки для машинного обучения (tensorflow, pytorch и т.д.). Мы не рекомендуем менять версии предустановленных базовых пакетов.

Образы, доступные для Jupyter Server, представлены на странице Библиотеки в образах Jupyter Server.

Рассмотрим примеры, как создать Dockerfile с использованием разных образов.

Пример Dockerfile для создания образа из базового

FROM cr.msk.sbercloud.ru/aicloud-jupyter/jupyter-cuda10.1-tf2.2.0-mlspace:latest
USER root
RUN apt-get install mypackage
USER jovyan

Пример Dockerfile для создания образа с требуемыми атрибутами

FROM cr.msk.sbercloud.ru/aicloud-jupyter/jupyter-cuda10.0-tf1.15.0-mlspace:latest
LABEL maintainer="user_email_address"

USER root

ENV PATH=$PATH:/usr/games/

RUN apt update -y && apt install -y \
    lolcat fortune cowsay

USER jovyan

Пример создания кастомного образа из контейнеров Nvidia

  1. Создайте пользователя jovyan (uid 1000, gid 1000) и домашний каталог /home/jovyan. В этот каталог будет смонтировано хранилище пользователя. Все действия будут осуществляться из-под этого непривилегированного пользователя.

    RUN useradd jovyan -u 1000 -m --shell /bin/bash
    USER jovyan
    
  2. Проверьте, что Jupyter Server запускаются на порту 8888 с нужным префиксом (переменная окружения NB_PREFIX=/a100-mt/notebook/ai0001011-00xxx/mynotebookname).

Docker file

FROM nvidia/pytorch:20.03-py3

USER root
# Add "jovyan" user (if you have other user with uid 1000 - replace it)
# /home/user/.local will hold python packages
RUN groupadd -g 1000 jovyan
RUN useradd -g jovyan -u 1000 -m jovyan

RUN mkdir -p /tmp/.jupyter_data && chown -R jovyan /tmp/.jupyter_data && \
    mkdir -p /tmp/.jupyter && chown -R jovyan /tmp/.jupyter

# REMOVE
#RUN mkdir -p /home/user && chown -R jovyan /home/user
#
#ENV PYTHONUSERBASE="/home/user/.local"
#ENV PATH=$PYTHONUSERBASE/bin:$PATH

USER jovyan

ENV SHELL=/bin/bash
ENV JUPYTER_CONFIG_DIR=/tmp/.jupyter
ENV JUPYTER_DATA_DIR=/tmp/.jupyter_data
ENV JUPYTER_PATH=/tmp/.jupyter


# check that you have jupyter and jupyterlab
# RUN pip install --upgrade --no-cache-dir notebook==6.1.4 jupyterlab==2.2.9
# RUN jupyter serverextension enable --py jupyterlab


# !!! В базовых образах поддерживаются все инструменты, что есть на платформе ML Space - ssh, tensorboard, mlflow, и т.п. !!!
# DOCS if you want to connect with ssh to jupyter server run - cp /home/jovyan/.ssh_aicloud/authorized_keys /home/jovyan/.ssh/authorized_keys
# env | egrep -v "^(HOME=|USER=|MAIL=|LC_ALL=|LS_COLORS=|LANG=|HOSTNAME=|PWD=|TERM=|SHLVL=|LANGUAGE=|_=)" >> /etc/environment.d/60-aicloudenvs.conf
# /etc/init.d/ssh start


WORKDIR /home/jovyan
EXPOSE 8888
ENTRYPOINT ["/bin/bash"]
CMD ["jupyter notebook \
              --notebook-dir=/home/jovyan \
              --ip=0.0.0.0 \
              --no-browser \
              --allow-root \
              --port=8888 \
              --NotebookApp.token='' \
              --NotebookApp.password='' \
              --NotebookApp.base_url=${NB_PREFIX} \
              --NotebookApp.allow_origin='https://mlspace.aicloud.sbercloud.ru'"]

Важно

  • Cодержимое NFS и пользовательские данные будут смонтированы в каталоге /home/jovyan. Данный каталог будет установлен в качестве рабочего.

  • Модули, расположенные внутри каталога соответствующей переменной PYTHON_LIB_PATH должны быть доступны для импорта интерпретатором python. По умолчанию это каталог: /home/user/conda/lib/python3.7. В него при запуске контейнера на кластере будет скопирована клиентская библиотека client_lib.py.

  • Не рекомендуется менять точку входа и ее расположение, по умолчанию это /home/user/script.sh. Она отвечает за копирование client_lib, старт Jupyter Server на порту 8888 и т.д.

Подготовка репозитория

Кастомные образы Jupyter Server необходимо размещать в репозиториях, в наименовании которых есть префикс «jupyter-».

Сборка кастомного образа и загрузка в Docker registry

Пользователь выполняет сборку кастомного образа (docker build), помечает образ тегом (docker tag) и загружает образ в реестр (docker push). См. Управление образами.