diff --git a/Dockerfile b/Dockerfile
index 3e2296e..3877057 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,23 +1,39 @@
-FROM pytorch/pytorch:2.0.0-cuda11.7-cudnn8-runtime
-#FROM tensorflow/tensorflow:2.12.0-gpu
+FROM pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtime
+ENV TZ=Europe/Samara
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ARG USER
ARG GROUP
ARG UID
ARG GID
+RUN apt update
+RUN apt install sudo -y
+RUN sed -i 's/^%sudo.*/%sudo ALL=(ALL) NOPASSWD: ALL/' /etc/sudoers
+
RUN groupadd --gid ${GID} ${GROUP}
-RUN useradd --shell /bin/bash --uid ${UID} --gid ${GID} --create-home ${USER}
+RUN useradd --shell /bin/bash --uid ${UID} --gid ${GID} -G sudo --create-home ${USER}
RUN mkdir /wd
RUN chown ${USER}:${GROUP} /wd
-# SYSTEM INITIALIZATION
-# RUN pip install jupyter
+# SYSTEM CONFIGURATION
+RUN apt install vim htop mc curl wget git tree -y
+RUN curl -fsSL https://code-server.dev/install.sh | sh
+RUN /opt/conda/bin/conda install -n base ipykernel --update-deps --force-reinstall -y
USER ${USER}
-# USER INITIALIZATION
+# USER CONFIGURATION
# RUN ...
+RUN openssl req -x509 -newkey rsa:4096 -keyout /home/${USER}/key.pem -out /home/${USER}/cert.pem -sha256 -nodes -days 365 -subj "/C=RU/ST=SamaraRegion/L=Samara/O=SSAU/OU=LIAV/CN=vscode.ssau.ru/"
+RUN mkdir -p /home/${USER}/.config/code-server
+RUN echo 'bind-addr: 0.0.0.0:8443' >> /home/${USER}/.config/code-server/config.yaml
+RUN echo "cert: /home/${USER}/cert.pem" >> /home/${USER}/.config/code-server/config.yaml
+RUN echo "cert-key: /home/${USER}/key.pem" >> /home/${USER}/.config/code-server/config.yaml
+
+RUN code-server --install-extension ms-python.python
+
+ENV SHELL=/bin/bash
SHELL ["/bin/bash", "--login", "-i", "-c"]
-WORKDIR /wd
+WORKDIR /wd
\ No newline at end of file
diff --git a/build.sh b/build.sh
index e276c02..7796d61 100755
--- a/build.sh
+++ b/build.sh
@@ -1,7 +1,7 @@
#!/bin/bash
CURDIRNAME=${PWD##*/}
-docker build . -t ${USER}_${CURDIRNAME} \
+docker build . -t ${USER}_${CURDIRNAME}_vscode \
--build-arg USER=${USER} \
--build-arg GROUP=${USER} \
--build-arg UID=$(id -u ${USER}) \
diff --git a/code_server_install.sh b/code_server_install.sh
new file mode 100644
index 0000000..7984460
--- /dev/null
+++ b/code_server_install.sh
@@ -0,0 +1,618 @@
+#!/bin/sh
+set -eu
+
+# code-server's automatic install script.
+# See https://coder.com/docs/code-server/latest/install
+
+usage() {
+ arg0="$0"
+ if [ "$0" = sh ]; then
+ arg0="curl -fsSL https://code-server.dev/install.sh | sh -s --"
+ else
+ not_curl_usage="The latest script is available at https://code-server.dev/install.sh
+"
+ fi
+
+ cath << EOF
+Installs code-server.
+It tries to use the system package manager if possible.
+After successful installation it explains how to start using code-server.
+
+Pass in user@host to install code-server on user@host over ssh.
+The remote host must have internet access.
+${not_curl_usage-}
+Usage:
+
+ $arg0 [--dry-run] [--version X.X.X] [--edge] [--method detect] \
+ [--prefix ~/.local] [--rsh ssh] [user@host]
+
+ --dry-run
+ Echo the commands for the install process without running them.
+
+ --version X.X.X
+ Install a specific version instead of the latest.
+
+ --edge
+ Install the latest edge version instead of the latest stable version.
+
+ --method [detect | standalone]
+ Choose the installation method. Defaults to detect.
+ - detect detects the system package manager and tries to use it.
+ Full reference on the process is further below.
+ - standalone installs a standalone release archive into ~/.local
+ Add ~/.local/bin to your \$PATH to use it.
+
+ --prefix
+ Sets the prefix used by standalone release archives. Defaults to ~/.local
+ The release is unarchived into ~/.local/lib/code-server-X.X.X
+ and the binary symlinked into ~/.local/bin/code-server
+ To install system wide pass --prefix=/usr/local
+
+ --rsh
+ Specifies the remote shell for remote installation. Defaults to ssh.
+
+The detection method works as follows:
+ - Debian, Ubuntu, Raspbian: install the deb package from GitHub.
+ - Fedora, CentOS, RHEL, openSUSE: install the rpm package from GitHub.
+ - Arch Linux: install from the AUR (which pulls releases from GitHub).
+ - FreeBSD, Alpine: install from npm.
+ - macOS: install using Homebrew if installed otherwise install from GitHub.
+ - All others: install the release from GitHub.
+
+We only build releases on GitHub for amd64 and arm64 on Linux and amd64 for
+macOS. When the detection method tries to pull a release from GitHub it will
+fall back to installing from npm when there is no matching release for the
+system's operating system and architecture.
+
+The standalone method will force installion using GitHub releases. It will not
+fall back to npm so on architectures without pre-built releases this will error.
+
+The installer will cache all downloaded assets into ~/.cache/code-server
+
+More installation docs are at https://coder.com/docs/code-server/latest/install
+EOF
+}
+
+echo_latest_version() {
+ if [ "${EDGE-}" ]; then
+ version="$(curl -fsSL https://api.github.com/repos/coder/code-server/releases | awk 'match($0,/.*"html_url": "(.*\/releases\/tag\/.*)".*/)' | head -n 1 | awk -F '"' '{print $4}')"
+ else
+ # https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c#gistcomment-2758860
+ version="$(curl -fsSLI -o /dev/null -w "%{url_effective}" https://github.com/coder/code-server/releases/latest)"
+ fi
+ version="${version#https://github.com/coder/code-server/releases/tag/}"
+ version="${version#v}"
+ echo "$version"
+}
+
+echo_npm_postinstall() {
+ echoh
+ cath << EOF
+npm package has been installed.
+
+Extend your path to use code-server:
+ PATH="$NPM_BIN_DIR:\$PATH"
+Then run with:
+ code-server
+EOF
+}
+
+echo_standalone_postinstall() {
+ echoh
+ cath << EOF
+Standalone release has been installed into $STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION
+
+Extend your path to use code-server:
+ PATH="$STANDALONE_INSTALL_PREFIX/bin:\$PATH"
+Then run with:
+ code-server
+EOF
+}
+
+echo_brew_postinstall() {
+ echoh
+ cath << EOF
+Brew release has been installed.
+
+Run with:
+ code-server
+EOF
+}
+
+echo_systemd_postinstall() {
+ echoh
+ cath << EOF
+$1 package has been installed.
+
+To have systemd start code-server now and restart on boot:
+ sudo systemctl enable --now code-server@\$USER
+Or, if you don't want/need a background service you can run:
+ code-server
+EOF
+}
+
+echo_coder_postinstall() {
+ echoh
+ echoh "Deploy code-server for your team with Coder: https://github.com/coder/coder"
+}
+
+main() {
+ if [ "${TRACE-}" ]; then
+ set -x
+ fi
+
+ unset \
+ DRY_RUN \
+ METHOD \
+ OPTIONAL \
+ ALL_FLAGS \
+ RSH_ARGS \
+ EDGE \
+ RSH
+
+ ALL_FLAGS=""
+ while [ "$#" -gt 0 ]; do
+ case "$1" in
+ -*)
+ ALL_FLAGS="${ALL_FLAGS} $1"
+ ;;
+ esac
+
+ case "$1" in
+ --dry-run)
+ DRY_RUN=1
+ ;;
+ --method)
+ METHOD="$(parse_arg "$@")"
+ shift
+ ;;
+ --method=*)
+ METHOD="$(parse_arg "$@")"
+ ;;
+ --prefix)
+ STANDALONE_INSTALL_PREFIX="$(parse_arg "$@")"
+ shift
+ ;;
+ --prefix=*)
+ STANDALONE_INSTALL_PREFIX="$(parse_arg "$@")"
+ ;;
+ --version)
+ VERSION="$(parse_arg "$@")"
+ shift
+ ;;
+ --version=*)
+ VERSION="$(parse_arg "$@")"
+ ;;
+ --edge)
+ EDGE=1
+ ;;
+ --rsh)
+ RSH="$(parse_arg "$@")"
+ shift
+ ;;
+ --rsh=*)
+ RSH="$(parse_arg "$@")"
+ ;;
+ -h | --h | -help | --help)
+ usage
+ exit 0
+ ;;
+ --)
+ shift
+ # We remove the -- added above.
+ ALL_FLAGS="${ALL_FLAGS% --}"
+ RSH_ARGS="$*"
+ break
+ ;;
+ -*)
+ echoerr "Unknown flag $1"
+ echoerr "Run with --help to see usage."
+ exit 1
+ ;;
+ *)
+ RSH_ARGS="$*"
+ break
+ ;;
+ esac
+
+ shift
+ done
+
+ if [ "${RSH_ARGS-}" ]; then
+ RSH="${RSH-ssh}"
+ echoh "Installing remotely with $RSH $RSH_ARGS"
+ curl -fsSL https://code-server.dev/install.sh | prefix "$RSH_ARGS" "$RSH" "$RSH_ARGS" sh -s -- "$ALL_FLAGS"
+ return
+ fi
+
+ METHOD="${METHOD-detect}"
+ if [ "$METHOD" != detect ] && [ "$METHOD" != standalone ]; then
+ echoerr "Unknown install method \"$METHOD\""
+ echoerr "Run with --help to see usage."
+ exit 1
+ fi
+
+ # These are used by the various install_* functions that make use of GitHub
+ # releases in order to download and unpack the right release.
+ CACHE_DIR=$(echo_cache_dir)
+ STANDALONE_INSTALL_PREFIX=${STANDALONE_INSTALL_PREFIX:-$HOME/.local}
+ VERSION=${VERSION:-$(echo_latest_version)}
+ # These can be overridden for testing but shouldn't normally be used as it can
+ # result in a broken code-server.
+ OS=${OS:-$(os)}
+ ARCH=${ARCH:-$(arch)}
+
+ distro_name
+
+ # Standalone installs by pulling pre-built releases from GitHub.
+ if [ "$METHOD" = standalone ]; then
+ if has_standalone; then
+ install_standalone
+ echo_coder_postinstall
+ exit 0
+ else
+ echoerr "There are no standalone releases for $ARCH"
+ echoerr "Please try again without '--method standalone'"
+ exit 1
+ fi
+ fi
+
+ # DISTRO can be overridden for testing but shouldn't normally be used as it
+ # can result in a broken code-server.
+ DISTRO=${DISTRO:-$(distro)}
+
+ case $DISTRO in
+ # macOS uses brew when available and falls back to standalone. We only have
+ # amd64 for macOS so for anything else use npm.
+ macos)
+ BREW_PATH="${BREW_PATH-brew}"
+ if command_exists "$BREW_PATH"; then
+ install_brew
+ else
+ echoh "Homebrew not installed."
+ echoh "Falling back to standalone installation."
+ npm_fallback install_standalone
+ fi
+ ;;
+ # The .deb and .rpm files are pulled from GitHub and we only have amd64 and
+ # arm64 there and need to fall back to npm otherwise.
+ debian) npm_fallback install_deb ;;
+ fedora | opensuse) npm_fallback install_rpm ;;
+ # Arch uses the AUR package which only supports amd64 and arm64 since it
+ # pulls releases from GitHub so we need to fall back to npm.
+ arch) npm_fallback install_aur ;;
+ # We don't have GitHub releases that work on Alpine or FreeBSD so we have no
+ # choice but to use npm here.
+ alpine | freebsd) install_npm ;;
+ # For anything else we'll try to install standalone but fall back to npm if
+ # we don't have releases for the architecture.
+ *)
+ echoh "Unsupported package manager."
+ echoh "Falling back to standalone installation."
+ npm_fallback install_standalone
+ ;;
+ esac
+
+ echo_coder_postinstall
+}
+
+parse_arg() {
+ case "$1" in
+ *=*)
+ # Remove everything after first equal sign.
+ opt="${1%%=*}"
+ # Remove everything before first equal sign.
+ optarg="${1#*=}"
+ if [ ! "$optarg" ] && [ ! "${OPTIONAL-}" ]; then
+ echoerr "$opt requires an argument"
+ echoerr "Run with --help to see usage."
+ exit 1
+ fi
+ echo "$optarg"
+ return
+ ;;
+ esac
+
+ case "${2-}" in
+ "" | -*)
+ if [ ! "${OPTIONAL-}" ]; then
+ echoerr "$1 requires an argument"
+ echoerr "Run with --help to see usage."
+ exit 1
+ fi
+ ;;
+ *)
+ echo "$2"
+ return
+ ;;
+ esac
+}
+
+fetch() {
+ URL="$1"
+ FILE="$2"
+
+ if [ -e "$FILE" ]; then
+ echoh "+ Reusing $FILE"
+ return
+ fi
+
+ sh_c mkdir -p "$CACHE_DIR"
+ sh_c curl \
+ -#fL \
+ -o "$FILE.incomplete" \
+ -C - \
+ "$URL"
+ sh_c mv "$FILE.incomplete" "$FILE"
+}
+
+install_brew() {
+ echoh "Installing latest from Homebrew."
+ echoh
+
+ sh_c "$BREW_PATH" install code-server
+
+ echo_brew_postinstall
+}
+
+install_deb() {
+ echoh "Installing v$VERSION of the $ARCH deb package from GitHub."
+ echoh
+
+ fetch "https://github.com/coder/code-server/releases/download/v$VERSION/code-server_${VERSION}_$ARCH.deb" \
+ "$CACHE_DIR/code-server_${VERSION}_$ARCH.deb"
+ sudo_sh_c dpkg -i "$CACHE_DIR/code-server_${VERSION}_$ARCH.deb"
+
+ echo_systemd_postinstall deb
+}
+
+install_rpm() {
+ echoh "Installing v$VERSION of the $ARCH rpm package from GitHub."
+ echoh
+
+ fetch "https://github.com/coder/code-server/releases/download/v$VERSION/code-server-$VERSION-$ARCH.rpm" \
+ "$CACHE_DIR/code-server-$VERSION-$ARCH.rpm"
+ sudo_sh_c rpm -U "$CACHE_DIR/code-server-$VERSION-$ARCH.rpm"
+
+ echo_systemd_postinstall rpm
+}
+
+install_aur() {
+ echoh "Installing latest from the AUR."
+ echoh
+
+ sh_c mkdir -p "$CACHE_DIR/code-server-aur"
+ sh_c "curl -#fsSL https://aur.archlinux.org/cgit/aur.git/snapshot/code-server.tar.gz | tar -xzC $CACHE_DIR/code-server-aur --strip-components 1"
+ echo "+ cd $CACHE_DIR/code-server-aur"
+ if [ ! "${DRY_RUN-}" ]; then
+ cd "$CACHE_DIR/code-server-aur"
+ fi
+ sh_c makepkg -si --noconfirm
+
+ echo_systemd_postinstall AUR
+}
+
+install_standalone() {
+ echoh "Installing v$VERSION of the $ARCH release from GitHub."
+ echoh
+
+ fetch "https://github.com/coder/code-server/releases/download/v$VERSION/code-server-$VERSION-$OS-$ARCH.tar.gz" \
+ "$CACHE_DIR/code-server-$VERSION-$OS-$ARCH.tar.gz"
+
+ # -w only works if the directory exists so try creating it first. If this
+ # fails we can ignore the error as the -w check will then swap us to sudo.
+ sh_c mkdir -p "$STANDALONE_INSTALL_PREFIX" 2> /dev/null || true
+
+ sh_c="sh_c"
+ if [ ! -w "$STANDALONE_INSTALL_PREFIX" ]; then
+ sh_c="sudo_sh_c"
+ fi
+
+ if [ -e "$STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION" ]; then
+ echoh
+ echoh "code-server-$VERSION is already installed at $STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION"
+ echoh "Remove it to reinstall."
+ exit 0
+ fi
+
+ "$sh_c" mkdir -p "$STANDALONE_INSTALL_PREFIX/lib" "$STANDALONE_INSTALL_PREFIX/bin"
+ "$sh_c" tar -C "$STANDALONE_INSTALL_PREFIX/lib" -xzf "$CACHE_DIR/code-server-$VERSION-$OS-$ARCH.tar.gz"
+ "$sh_c" mv -f "$STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION-$OS-$ARCH" "$STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION"
+ "$sh_c" ln -fs "$STANDALONE_INSTALL_PREFIX/lib/code-server-$VERSION/bin/code-server" "$STANDALONE_INSTALL_PREFIX/bin/code-server"
+
+ echo_standalone_postinstall
+}
+
+install_npm() {
+ echoh "Installing latest from npm."
+ echoh
+
+ NPM_PATH="${YARN_PATH-npm}"
+
+ if command_exists "$NPM_PATH"; then
+ sh_c="sh_c"
+ if [ ! "${DRY_RUN-}" ] && [ ! -w "$(NPM_PATH config get prefix)" ]; then
+ sh_c="sudo_sh_c"
+ fi
+ echoh "Installing with npm."
+ echoh
+ "$sh_c" "$NPM_PATH" install -g code-server --unsafe-perm
+ NPM_BIN_DIR="\$($NPM_PATH bin -g)" echo_npm_postinstall
+ return
+ fi
+ echoerr "Please install npm to install code-server!"
+ echoerr "You will need at least node v12 and a few C dependencies."
+ echoerr "See the docs https://coder.com/docs/code-server/latest/install#npm"
+
+ exit 1
+}
+
+# Run $1 if we have a standalone otherwise run install_npm.
+npm_fallback() {
+ if has_standalone; then
+ $1
+ else
+ echoh "No standalone releases for $ARCH."
+ echoh "Falling back to installation from npm."
+ install_npm
+ fi
+}
+
+# Determine if we have standalone releases on GitHub for the system's arch.
+has_standalone() {
+ case $ARCH in
+ amd64) return 0 ;;
+ # We only have amd64 for macOS.
+ arm64)
+ [ "$(distro)" != macos ]
+ return
+ ;;
+ *) return 1 ;;
+ esac
+}
+
+os() {
+ uname="$(uname)"
+ case $uname in
+ Linux) echo linux ;;
+ Darwin) echo macos ;;
+ FreeBSD) echo freebsd ;;
+ *) echo "$uname" ;;
+ esac
+}
+
+# Print the detected Linux distro, otherwise print the OS name.
+#
+# Example outputs:
+# - macos -> macos
+# - freebsd -> freebsd
+# - ubuntu, raspbian, debian ... -> debian
+# - amzn, centos, rhel, fedora, ... -> fedora
+# - opensuse-{leap,tumbleweed} -> opensuse
+# - alpine -> alpine
+# - arch, manjaro, endeavouros, ... -> arch
+#
+# Inspired by https://github.com/docker/docker-install/blob/26ff363bcf3b3f5a00498ac43694bf1c7d9ce16c/install.sh#L111-L120.
+distro() {
+ if [ "$OS" = "macos" ] || [ "$OS" = "freebsd" ]; then
+ echo "$OS"
+ return
+ fi
+
+ if [ -f /etc/os-release ]; then
+ (
+ . /etc/os-release
+ if [ "${ID_LIKE-}" ]; then
+ for id_like in $ID_LIKE; do
+ case "$id_like" in debian | fedora | opensuse | arch)
+ echo "$id_like"
+ return
+ ;;
+ esac
+ done
+ fi
+
+ echo "$ID"
+ )
+ return
+ fi
+}
+
+# Print a human-readable name for the OS/distro.
+distro_name() {
+ if [ "$(uname)" = "Darwin" ]; then
+ echo "macOS v$(sw_vers -productVersion)"
+ return
+ fi
+
+ if [ -f /etc/os-release ]; then
+ (
+ . /etc/os-release
+ echo "$PRETTY_NAME"
+ )
+ return
+ fi
+
+ # Prints something like: Linux 4.19.0-9-amd64
+ uname -sr
+}
+
+arch() {
+ uname_m=$(uname -m)
+ case $uname_m in
+ aarch64) echo arm64 ;;
+ x86_64) echo amd64 ;;
+ *) echo "$uname_m" ;;
+ esac
+}
+
+command_exists() {
+ if [ ! "$1" ]; then return 1; fi
+ command -v "$@" > /dev/null
+}
+
+sh_c() {
+ echoh "+ $*"
+ if [ ! "${DRY_RUN-}" ]; then
+ sh -c "$*"
+ fi
+}
+
+sudo_sh_c() {
+ if [ "$(id -u)" = 0 ]; then
+ sh_c "$@"
+ elif command_exists doas; then
+ sh_c "doas $*"
+ elif command_exists sudo; then
+ sh_c "sudo $*"
+ elif command_exists su; then
+ sh_c "su root -c '$*'"
+ else
+ echoh
+ echoerr "This script needs to run the following command as root."
+ echoerr " $*"
+ echoerr "Please install doas, sudo, or su."
+ exit 1
+ fi
+}
+
+echo_cache_dir() {
+ if [ "${XDG_CACHE_HOME-}" ]; then
+ echo "$XDG_CACHE_HOME/code-server"
+ elif [ "${HOME-}" ]; then
+ echo "$HOME/.cache/code-server"
+ else
+ echo "/tmp/code-server-cache"
+ fi
+}
+
+echoh() {
+ echo "$@" | humanpath
+}
+
+cath() {
+ humanpath
+}
+
+echoerr() {
+ echoh "$@" >&2
+}
+
+# humanpath replaces all occurrences of " $HOME" with " ~"
+# and all occurrences of '"$HOME' with the literal '"$HOME'.
+humanpath() {
+ sed "s# $HOME# ~#g; s#\"$HOME#\"\$HOME#g"
+}
+
+# We need to make sure we exit with a non zero exit if the command fails.
+# /bin/sh does not support -o pipefail unfortunately.
+prefix() {
+ PREFIX="$1"
+ shift
+ fifo="$(mktemp -d)/fifo"
+ mkfifo "$fifo"
+ sed -e "s#^#$PREFIX: #" "$fifo" &
+ "$@" > "$fifo" 2>&1
+}
+
+main "$@"
\ No newline at end of file
diff --git a/daemon.sh b/daemon.sh
deleted file mode 100755
index 6e8d780..0000000
--- a/daemon.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-CURDIRNAME=${PWD##*/}
-
-docker run -d --gpus "device=0" -p 8888:8888 -v $(pwd):/wd --name ${USER}_${CURDIRNAME} ${USER}_${CURDIRNAME}
\ No newline at end of file
diff --git a/interactively.sh b/interactively.sh
deleted file mode 100755
index 8f5e83e..0000000
--- a/interactively.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-CURDIRNAME=${PWD##*/}
-
-docker run -it --rm --gpus "device=0" -p 8888:8888 -v $(pwd):/wd --name ${USER}_${CURDIRNAME} ${USER}_${CURDIRNAME}
\ No newline at end of file
diff --git a/readme.md b/readme.md
index aecffe7..3c6d061 100644
--- a/readme.md
+++ b/readme.md
@@ -1,14 +1,43 @@
+Для запуска vscode на сервере скопируйте в терминал и запустите:
+```
+PROJECT=myprojectname; git clone https://git.ai.ssau.ru/liav/docker_template --branch vscode $PROJECT; cd $PROJECT; ./build.sh; ./vscode.sh
+```
+Если порт занят, поменяйте его в скрипте `vscode.sh` и запустите `./vscode.sh` заново.
+
+При использовании этой схемы будет получен контейнер с пользователем, идентичным пользователю в `host` системе. Новые файлы (логи/модели etm.) и процессы в диспетчере процессов (top/htop) хоста будут принадлежать вашему пользователю. Параметр `-v $(pwd):/wd ` в `start` скриптах означает, что директория `/wd` в контейнере будет связана с текущей папкой на хосте.
+
+Настроить рабочее окружение в контейнере можно либо классическим способом внутри контейнера, с возможностью эскалации прав до root командой `sudo`. Либо в более воспроизводимом ключе по шагам:
+
+1. Скачивание шаблона в новую папку с названием `myprojectname`, переход в неё по завершению
```
-git clone https://git.ai.ssau.ru/liav/docker_template myproject
-cd myproject
+PROJECT=myprojectname; git clone https://git.ai.ssau.ru/liav/docker_template --branch vscode $PROJECT; cd $PROJECT
```
-Модифицируйте `Dockerfile` для выбора базового образа из https://hub.docker.com/ и установки зависимостей. Отредактируйте .dockerfile, если хотите скопировать файлы в образ командой COPY (по-умолчанию файлы не отправляются в контекст для ускорения сборки).
+
+2. Редактирование Dockerfile для смены базового образа, установки ПО и настройки среды образа.
+
+3. Выполнение построения образа/отладка процесса построения
```
./build.sh
-./start_daemon.sh или ./start_interactively.sh
```
------------------------------------
-При использовании этой схемы будет получен контейнер с пользователем, идентичным пользователю в `host` системе. Новые файлы (логи/модели etm.) и процессы в диспетчере процессов (top/htop) хоста будут принадлежать вашему пользователю.
-Параметр `-v $(pwd):/wd ` в `start` скриптах означает, что директория `/wd` в контейнере будет связана с текущей папкой на хосте.
+4. Редактирование аргументов запуска контейнера:
+ - изменение номера/добавление доступных ГПУ в запускаемом контейнере (`--gpus` аргумент),
+ - изменение порта для vscode (`-p` аргумент),
+ - добавление папок хост системы, доступных из контейнера (`-v` аргумент).
+
+5. Запуск контейнера на основе построенного образа
+```
+./vscode.sh
+```
+
+Для остановки vscode используйте `./stop.sh`.
+
+# QnA
+
+Что делать, если появляется ошибка просмотра ipynb файлов "could not register service worker"?
+Попробуйте Firefox или Brave.
+
+Как узнать пароль для vscode у запущенного контейнера?
+Выведите информацию о контейнере командой `docker inspect `. Пароль будет находится в разделе переменных окружения.
+
diff --git a/stop.sh b/stop.sh
new file mode 100755
index 0000000..c81688e
--- /dev/null
+++ b/stop.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+CURDIRNAME=${PWD##*/}
+
+docker stop ${USER}_${CURDIRNAME}_vscode
diff --git a/vscode.sh b/vscode.sh
new file mode 100755
index 0000000..fe0faff
--- /dev/null
+++ b/vscode.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+CURDIRNAME=${PWD##*/}
+
+VSCODE_PORT=8400
+YOURAPP_INSIDE_DOCKER_PORT=24000
+PASSWORD=$(openssl rand -base64 45)
+docker run \
+ -d \
+ --rm \
+ --gpus "device=0" \
+ -p ${VSCODE_PORT}:8443 \
+ -p ${YOURAPP_INSIDE_DOCKER_PORT}:443 \
+ -v $(pwd):/wd \
+ --shm-size=10gb \
+ --name ${USER}_${CURDIRNAME}_vscode \
+ -e PASSWORD="${PASSWORD}" \
+ ${USER}_${CURDIRNAME}_vscode \
+ code-server
+sleep 1
+docker logs ${USER}_${CURDIRNAME}_vscode
+echo ""
+echo "Address: https://your_server_ip:${VSCODE_PORT}"
+echo "Password: $PASSWORD"
+echo ""
+echo "You can use this port for application you develop: $YOURAPP_INSIDE_DOCKER_PORT"
+echo "You can lookup vscode password with docker inspect container_name | grep PASSWORD"
\ No newline at end of file