Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inquiry about Binder usage for University/Canadian Government training sessions with Jupyter Notebooks and Terminal interactions #3210

Closed
kasra-keshavarz opened this issue Feb 5, 2025 · 4 comments

Comments

@kasra-keshavarz
Copy link

kasra-keshavarz commented Feb 5, 2025

Hello Binder Team,

We are a research team at the University of Calgary in the field of Hydrology (https://github.com/CH-Earth), and we are planning to conduct a training session for some of our partners with the Government of Canada along with some provincial folks using your platform. The training will involve 15-20 participants, and we intend to use Jupyter Notebook sessions along with terminal interactions to educate our partners on how to use our tools effectively.

Here is the repository we used last time for a similar training:
CH-Earth/community-modelling-workflow-training (binder branch). We are currently updating it to work seamlessly with Binder.

We have a few questions regarding our planned usage:

  1. Terminal Usage: Is it acceptable to use the terminal for lightweight experiments within Binder sessions? During my testing, the terminal crashes immediately when running a few commands. Is this a problem specific to my session, or is it a general policy restriction with Binder sessions?

  2. Session Type: Is a session like this (Jupyter Notebooks + terminal interactions + University/Government settings) acceptable for Binder?

  3. Duration: The training session will likely take 3 hours in total. Is this duration acceptable for a Binder session?

  4. Additional Information: Is there anything else we should know or consider when planning this training session?

I'd greatly appreciate your feedback.
Cheers

@manics
Copy link
Member

manics commented Feb 10, 2025

Terminal Usage: Is it acceptable to use the terminal for lightweight experiments within Binder sessions? During my testing, the terminal crashes immediately when running a few commands.

This is definitely fine, it's part of JupyterLab! If it crashes this is either because it's using too many resources, or it may have triggered our anti-malware/anti-cryptomining defences. Let us know if there's a particular command that you think is incorrectly triggering our detection

Session Type: Is a session like this (Jupyter Notebooks + terminal interactions + University/Government settings) acceptable for Binder?

Yes

Duration: The training session will likely take 3 hours in total. Is this duration acceptable for a Binder session?

This should be fine

Additional Information: Is there anything else we should know or consider when planning this training session?

We had a significant reduction in donated compute capacity last year which severely limited what we could offer. We've brought on some new donated capacity in the past month, but be aware there's still a risk of there being insufficient resources.

@kasra-keshavarz
Copy link
Author

kasra-keshavarz commented Feb 10, 2025

Thank you for all the answers, much appreciated.

This is definitely fine, it's part of JupyterLab! If it crashes this is either because it's using too many resources, or it may have triggered our anti-malware/anti-cryptomining defences. Let us know if there's a particular command that you think is incorrectly triggering our detection

Thank you so much for this. I am using this Binder session as our base environment, and when I execute a simple command like the following in the JupyterLab's Terminal:

$ gcc

The terminal session crashes (the Binder session would still run):

Click to expand the terminal output messages
+++ micromamba shell hook -s posix -r /srv/conda
++ eval '#' Copyright '(C)' 2012 Anaconda, Inc '#' SPDX-License-Identifier: BSD-3-Clause '__mamba_exe()' '(' '"/usr/local/bin/micromamba"' '"${@}"' ')' '__mamba_hashr()' '{' if '[' -n '"${ZSH_VERSION:+x}"' '];' then '\rehash' elif '[' -n '"${POSH_VERSION:+x}"' '];' then : '#' pass else '\hash' -r fi '}' '__mamba_xctivate()' '{' '\local' ask_mamba 'ask_mamba="$(PS1="${PS1:-}"' __mamba_exe shell '"${@}"' --shell 'bash)"' '||' '\return' '\eval' '"${ask_mamba}"' __mamba_hashr '}' '__mamba_wrap()' '{' '\local' 'cmd="${1-__missing__}"' case '"${cmd}"' in 'activate|reactivate|deactivate)' __mamba_xctivate '"${@}"' ';;' 'install|update|upgrade|remove|uninstall)' __mamba_exe '"${@}"' '||' '\return' __mamba_xctivate reactivate ';;' 'self-update)' __mamba_exe '"${@}"' '||' '\return' '#' remove leftover backup file on Windows if '[' -f '"/usr/local/bin/micromamba.bkup"' '];' then rm -f '"/usr/local/bin/micromamba.bkup"' fi ';;' '*)' __mamba_exe '"${@}"' ';;' esac '}' '#' We need to define a function with the same name as the executable to be called by the user. '#' There is no way to register it dynamically without relying on hacks or eval. '__exe_name="$(basename' '"/usr/local/bin/micromamba")"' '__exe_name="${__exe_name%.*}"' case '"${__exe_name}"' in 'micromamba)' 'micromamba()' '{' __mamba_wrap '"$@"' '}' ';;' 'mamba)' 'mamba()' '{' __mamba_wrap '"$@"' '}' ';;' '*)' echo '"Error' unknown MAMBA_EXE: '\"/usr/local/bin/micromamba\",' filename must be mamba or 'micromamba"' '1>&2' ';;' esac if '[' -z '"${CONDA_SHLVL+x}"' '];' then '\export' CONDA_SHLVL=0 '\export' 'PATH="${MAMBA_ROOT_PREFIX}/condabin:${PATH}"' '#' 'We'\''re' not allowing PS1 to be unbound. It must at least be set. '#' However, 'we'\''re' not exporting it, which can cause problems when starting a second shell '#' via a first shell '(i.e.' starting zsh from 'bash).' if '[' -z '"${PS1+x}"' '];' then PS1= fi fi
++ for name in conda mamba
++ CONDA_PROFILE=/srv/conda/etc/profile.d/conda.sh
++ echo 'Activating profile: /srv/conda/etc/profile.d/conda.sh'
Activating profile: /srv/conda/etc/profile.d/conda.sh
++ test -f /srv/conda/etc/profile.d/conda.sh
++ . /srv/conda/etc/profile.d/conda.sh
+++ export CONDA_EXE=/srv/conda/bin/conda
+++ CONDA_EXE=/srv/conda/bin/conda
+++ export _CE_M=
+++ _CE_M=
+++ export _CE_CONDA=
+++ _CE_CONDA=
+++ export CONDA_PYTHON_EXE=/srv/conda/bin/python
+++ CONDA_PYTHON_EXE=/srv/conda/bin/python
+++ '[' -z x ']'
++ for name in conda mamba
++ CONDA_PROFILE=/srv/conda/etc/profile.d/mamba.sh
++ echo 'Activating profile: /srv/conda/etc/profile.d/mamba.sh'
Activating profile: /srv/conda/etc/profile.d/mamba.sh
++ test -f /srv/conda/etc/profile.d/mamba.sh
++ . /srv/conda/etc/profile.d/mamba.sh
+++ export MAMBA_ROOT_PREFIX=/srv/conda
+++ MAMBA_ROOT_PREFIX=/srv/conda
++++ /srv/conda/bin/mamba shell hook --shell posix
+++ __mamba_setup='
# Copyright (C) 2012 Anaconda, Inc
# SPDX-License-Identifier: BSD-3-Clause

__mamba_exe() (
  "/srv/conda/bin/mamba" "${@}"
)

__mamba_hashr() {
  if [ -n "${ZSH_VERSION:+x}" ]; then
      \rehash
  elif [ -n "${POSH_VERSION:+x}" ]; then
      :  # pass
  else
      \hash -r
  fi
}

__mamba_xctivate() {
  \local ask_mamba
  ask_mamba="$(PS1="${PS1:-}" __mamba_exe shell "${@}" --shell bash)" || \return
  \eval "${ask_mamba}"
  __mamba_hashr
}

__mamba_wrap() {
  \local cmd="${1-__missing__}"
  case "${cmd}" in
      activate|reactivate|deactivate)
          __mamba_xctivate "${@}"
          ;;
      install|update|upgrade|remove|uninstall)
          __mamba_exe "${@}" || \return
          __mamba_xctivate reactivate
          ;;
      self-update)
          __mamba_exe "${@}" || \return

          # remove leftover backup file on Windows
          if [ -f "/srv/conda/bin/mamba.bkup" ]; then
              rm -f "/srv/conda/bin/mamba.bkup"
          fi
          ;;
      *)
          __mamba_exe "${@}"
          ;;
  esac
}


# We need to define a function with the same name as the executable to be called by the user.
# There is no way to register it dynamically without relying on hacks or eval.
__exe_name="$(basename "/srv/conda/bin/mamba")"
__exe_name="${__exe_name%.*}"

case "${__exe_name}" in
  micromamba)
      micromamba() {
          __mamba_wrap "$@"
      }
      ;;
  mamba)
      mamba() {
          __mamba_wrap "$@"
      }
      ;;
  *)
      echo "Error unknown MAMBA_EXE: \"/srv/conda/bin/mamba\", filename must be mamba or micromamba" 1>&2
      ;;
esac


if [ -z "${CONDA_SHLVL+x}" ]; then
  \export CONDA_SHLVL=0
  \export PATH="${MAMBA_ROOT_PREFIX}/condabin:${PATH}"

  # We'\''re not allowing PS1 to be unbound. It must at least be set.
  # However, we'\''re not exporting it, which can cause problems when starting a second shell
  # via a first shell (i.e. starting zsh from bash).
  if [ -z "${PS1+x}" ]; then
      PS1=
  fi
fi'
+++ '[' 0 -eq 0 ']'
+++ eval '
# Copyright (C) 2012 Anaconda, Inc
# SPDX-License-Identifier: BSD-3-Clause

__mamba_exe() (
  "/srv/conda/bin/mamba" "${@}"
)

__mamba_hashr() {
  if [ -n "${ZSH_VERSION:+x}" ]; then
      \rehash
  elif [ -n "${POSH_VERSION:+x}" ]; then
      :  # pass
  else
      \hash -r
  fi
}

__mamba_xctivate() {
  \local ask_mamba
  ask_mamba="$(PS1="${PS1:-}" __mamba_exe shell "${@}" --shell bash)" || \return
  \eval "${ask_mamba}"
  __mamba_hashr
}

__mamba_wrap() {
  \local cmd="${1-__missing__}"
  case "${cmd}" in
      activate|reactivate|deactivate)
          __mamba_xctivate "${@}"
          ;;
      install|update|upgrade|remove|uninstall)
          __mamba_exe "${@}" || \return
          __mamba_xctivate reactivate
          ;;
      self-update)
          __mamba_exe "${@}" || \return

          # remove leftover backup file on Windows
          if [ -f "/srv/conda/bin/mamba.bkup" ]; then
              rm -f "/srv/conda/bin/mamba.bkup"
          fi
          ;;
      *)
          __mamba_exe "${@}"
          ;;
  esac
}


# We need to define a function with the same name as the executable to be called by the user.
# There is no way to register it dynamically without relying on hacks or eval.
__exe_name="$(basename "/srv/conda/bin/mamba")"
__exe_name="${__exe_name%.*}"

case "${__exe_name}" in
  micromamba)
      micromamba() {
          __mamba_wrap "$@"
      }
      ;;
  mamba)
      mamba() {
          __mamba_wrap "$@"
      }
      ;;
  *)
      echo "Error unknown MAMBA_EXE: \"/srv/conda/bin/mamba\", filename must be mamba or micromamba" 1>&2
      ;;
esac


if [ -z "${CONDA_SHLVL+x}" ]; then
  \export CONDA_SHLVL=0
  \export PATH="${MAMBA_ROOT_PREFIX}/condabin:${PATH}"

  # We'\''re not allowing PS1 to be unbound. It must at least be set.
  # However, we'\''re not exporting it, which can cause problems when starting a second shell
  # via a first shell (i.e. starting zsh from bash).
  if [ -z "${PS1+x}" ]; then
      PS1=
  fi
fi'
+++++ basename /srv/conda/bin/mamba
++++ __exe_name=mamba
++++ __exe_name=mamba
++++ case "${__exe_name}" in
++++ '[' -z x ']'
+++ unset __mamba_setup
++ [[ /srv/conda/envs/notebook != \/\s\r\v\/\c\o\n\d\a\/\e\n\v\s\/\n\o\t\e\b\o\o\k ]]
++ mamba activate /srv/conda/envs/notebook
++ __mamba_wrap activate /srv/conda/envs/notebook
++ local cmd=activate
++ case "${cmd}" in
++ __mamba_xctivate activate /srv/conda/envs/notebook
++ local ask_mamba
+++ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+++ __mamba_exe shell activate /srv/conda/envs/notebook --shell bash
+++ /srv/conda/bin/mamba shell activate /srv/conda/envs/notebook --shell bash
++ ask_mamba='PS1='\''(notebook) ${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '\''
export PATH='\''/srv/conda/envs/notebook/bin:/home/jovyan/.local/bin:/srv/conda/condabin:/home/jovyan/.local/bin:/srv/conda/bin:/srv/npm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'\''
export CONDA_SHLVL='\''1'\''
export CONDA_PROMPT_MODIFIER='\''(notebook) '\'''
++ eval 'PS1='\''(notebook) ${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '\''
export PATH='\''/srv/conda/envs/notebook/bin:/home/jovyan/.local/bin:/srv/conda/condabin:/home/jovyan/.local/bin:/srv/conda/bin:/srv/npm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'\''
export CONDA_SHLVL='\''1'\''
export CONDA_PROMPT_MODIFIER='\''(notebook) '\'''
+++ PS1='(notebook) ${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+++ export PATH=/srv/conda/envs/notebook/bin:/home/jovyan/.local/bin:/srv/conda/condabin:/home/jovyan/.local/bin:/srv/conda/bin:/srv/npm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+++ PATH=/srv/conda/envs/notebook/bin:/home/jovyan/.local/bin:/srv/conda/condabin:/home/jovyan/.local/bin:/srv/conda/bin:/srv/npm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+++ export CONDA_SHLVL=1
+++ CONDA_SHLVL=1
+++ export 'CONDA_PROMPT_MODIFIER=(notebook) '
+++ CONDA_PROMPT_MODIFIER='(notebook) '
++ __mamba_hashr
++ '[' -n '' ']'
++ '[' -n '' ']'
++ hash -r
+ unset i
+ '[' -n '5.1.16(1)-release' ']'
+ '[' -f /home/jovyan/.bashrc ']'
+ . /home/jovyan/.bashrc
++ case $- in
++ HISTCONTROL=ignoreboth
++ shopt -s histappend
++ HISTSIZE=1000
++ HISTFILESIZE=2000
++ shopt -s checkwinsize
++ '[' -x /usr/bin/lesspipe ']'
+++ SHELL=/bin/sh
+++ lesspipe
++ eval 'export LESSOPEN="| /usr/bin/lesspipe %s";
export LESSCLOSE="/usr/bin/lesspipe %s %s";'
+++ export 'LESSOPEN=| /usr/bin/lesspipe %s'
+++ LESSOPEN='| /usr/bin/lesspipe %s'
+++ export 'LESSCLOSE=/usr/bin/lesspipe %s %s'
+++ LESSCLOSE='/usr/bin/lesspipe %s %s'
++ '[' -z '' ']'
++ '[' -r /etc/debian_chroot ']'
++ case "$TERM" in
++ color_prompt=yes
++ '[' -n '' ']'
++ '[' yes = yes ']'
++ PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
++ unset color_prompt force_color_prompt
++ case "$TERM" in
++ PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
++ '[' -x /usr/bin/dircolors ']'
++ test -r /home/jovyan/.dircolors
+++ dircolors -b
++ eval 'LS_COLORS='\''rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'\'';
export LS_COLORS'
+++ LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
+++ export LS_COLORS
++ alias 'ls=ls --color=auto'
++ alias 'grep=grep --color=auto'
++ alias 'fgrep=fgrep --color=auto'
++ alias 'egrep=egrep --color=auto'
++ alias 'll=ls -alF'
++ alias 'la=ls -A'
++ alias 'l=ls -CF'
++ alias 'alert=notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
++ '[' -f /home/jovyan/.bash_aliases ']'
++ shopt -oq posix
++ '[' -f /usr/share/bash-completion/bash_completion ']'
++ '[' -f /etc/bash_completion ']'
+ '[' -d /home/jovyan/bin ']'
+ '[' -d /home/jovyan/.local/bin ']'
+ PATH=/home/jovyan/.local/bin:/srv/conda/envs/notebook/bin:/home/jovyan/.local/bin:/srv/conda/condabin:/home/jovyan/.local/bin:/srv/conda/bin:/srv/npm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
jovyan@jupyter-kasra-keshavarz-maf-env-basic-k5kfs7wp:~$ gcc
gcc: fatal error: no input files
compilation terminated.

However, if I do

jovyan@jupyter-kasra-keshavarz-maf-env-basic-k5kfs7wp:~$ script terminal.log

The terminal session works just fine, and I can run routine commands such as the $ gcc one. I'm not sure what is going on.

@manics
Copy link
Member

manics commented Feb 11, 2025

It's a bug! jupyterhub/repo2docker#1405
Should be fixed by jupyterhub/repo2docker#1409

As a temporary workaround you can run set +e (or set +ex) in your terminal.

@kasra-keshavarz
Copy link
Author

Awesome, thank you so much 😊. I've got all the answers to my question so I close this issue, but feel free to open, if there is a need.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants