Using Visual Studio Code in RenkuLab interactive sessions

Most users of renku are familiar with the JupyterLab interface - it is
widely used and usually the default for most renku projects. However, for
daily work, the notebook environment leaves quite a lot to be desired, and
especially those who are used to working within an IDE or a more powerful
editor of some kind feel frustrated with the limited functionality of JupyterLab.

Luckily there is an easy solution! Visual Studio Code (VSCode) is quite a
popular editor gaining lots of traction also among those who like to work with
notebooks. It offers an excellent editor with some IDE capabilities and is very
customizable via its extension system. These extensions include a Python
extension
with some very nice
features for debugging, formatting, linting, etc. In addition, it allows you to
designate sections of python scripts as cells and execute them interactively,
or to simply run Jupyter notebooks directly from the editor. I highly recomment
that you check it out if you spend a lot of time writing code in interactive sessions.

Installing VSCode in your interactive sessions

To enable VSCode in your renkulab sessions, you need to modify your Dockerfile
slightly. If you are using a recent template, your Dockerfile will look
something like this

ARG RENKU_BASE_IMAGE=renku/renkulab-py:3.7-0.7.3
FROM ${RENKU_BASE_IMAGE}

...

To add VSCode, simply add these lines below FROM ${RENKU_BASE_IMAGE}:

RUN curl -s https://raw.githubusercontent.com/SwissDataScienceCenter/renkulab-docker/master/scripts/install-vscode.sh | bash

This will run a script that installs VSCode and a few additional components
needed to make it play nice with the Jupyter notebook server.

Once you push this change, your image will be built by renkulab and once it is
ready you can launch a new interactive session as normal. However, you will
notice that you have a new launcher icon in your JupyterLab session:

You can click the icon to go to VSCode. This is now a fully-functional VSCode
session, running inside your interactive session. You can use it like you would
use VSCode on your own computer with the Python extension pre-installed.
The extension allows you to execute .py files “cell” by cell,

run Jupyter notebooks

or use the fully-featured debugger

Using this functionality on RenkuLab is fairly new and not very thoroughly tested, so
please report back if you run into problems or (even better) come up with interesting
use-cases!

Python extension issues

The Python extension, as amazing as it is, seems to be somewhat unstable. That is why a specific version is installed by the installation script - if you update the Python extension it most likely will no longer work. If you do update and it works - let us know! We can update the script accordingly. Because of these problems, automatically updating extensions is also disabled by the install script.

Installing extensions

Because your VSCode session is spawned from your Docker image, the extensions that you install “on-the-fly” (e.g. by using the extensions marketplace within VSCode) will not persist the next time you start up a session. To install them permanently, you need to do it through the Dockerfile. The easiest way is to find the extension you want in the VSCode marketplace and look up its identifier - e.g. here is the GitHub Pull Requests extension with its identifier:

In your Dockerfile, after the line that installs VSCode, you would add a line like

RUN code-server --install-extension GitHub.vscode-pull-request-github

Now, the next time you start a fresh session, this extension will be pre-installed for you. Note that not all VSCode extensions are available for code-server, but most of them should be.

Changing the VSCode version

If, for some reason, you want to install a specific version of VSCode, you can do so by adding
an environment variable to your Dockerfile before the VSCode installation script is called.
You can look up a code-server release and add
the version to your Dockerfile like this:

ENV VSCODE_VERSION=3.8.0
3 Likes

Wow, this is truly amazing, a dream come true! Thanks for this amazing new option folks! One quick question: if I understand correctly, it is just a matter of appending the line RUN curl -s https://raw.githubusercontent.com/SwissDataScienceCenter/renkulab-docker/master/scripts/install-vscode.sh | bash to the Dockerfile. Which is the last Renku image with CUDA support that I could use?

Thanks!
Luis

Hi @lusamino, glad to hear you’re excited about VSCode :slight_smile:

Just copy-pasting that line into any renku-based Dockerfile should work. For cuda, the latest image is renku/renkulab-cuda10.0-tf1.14:0.7.4.

Hi @rrrrrok, thank you for the explanations. I followed the steps mentionned here and everything worked fine until I had the visual studio icon.
However, when I click on it, I have a new page with 500 : Internal Server Error on jupyter hub. Would you have any idea of what the issue might be ?
Thanks

Hi @PaulineML sorry it’s not working for you! On the renkulab page listing the running sessions for you project, could you please look at the logs and paste them here?

Sure, here they are:

/entrypoint.sh: line 25: /home/jovyan/.local/bin/renku: No such file or directory
[W 2021-10-12 15:42:41.410 SingleUserNotebookApp configurable:190] Config option `open_browser` not recognized by `SingleUserNotebookApp`.  Did you mean `browser`?
[I 2021-10-12 15:42:41.432 SingleUserNotebookApp notebookapp:1593] Authentication of /metrics is OFF, since other authentication is disabled.
[W 2021-10-12 15:42:42.473 LabApp] 'ip' has moved from NotebookApp to ServerApp. This config will be passed to ServerApp. Be sure to update your config before our next release.
[W 2021-10-12 15:42:42.474 LabApp] 'port' has moved from NotebookApp to ServerApp. This config will be passed to ServerApp. Be sure to update your config before our next release.
[W 2021-10-12 15:42:42.474 LabApp] 'port' has moved from NotebookApp to ServerApp. This config will be passed to ServerApp. Be sure to update your config before our next release.
[W 2021-10-12 15:42:42.474 LabApp] 'port' has moved from NotebookApp to ServerApp. This config will be passed to ServerApp. Be sure to update your config before our next release.
[I 2021-10-12 15:42:42.483 LabApp] JupyterLab extension loaded from /opt/conda/lib/python3.9/site-packages/jupyterlab
[I 2021-10-12 15:42:42.483 LabApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
/opt/conda/lib/python3.9/site-packages/jupyter_server/transutils.py:13: FutureWarning: The alias `_()` will be deprecated. Use `_i18n()` instead.
  warnings.warn(warn_msg, FutureWarning)
Patching auth into jupyter_server.base.handlers.JupyterHandler(jupyter_server.base.handlers.AuthenticatedHandler) -> JupyterHandler(jupyterhub.singleuser.mixins.HubAuthenticatedHandler, jupyter_server.base.handlers.AuthenticatedHandler)
[I 2021-10-12 15:42:42.567 SingleUserNotebookApp mixins:576] Starting jupyterhub-singleuser server version 1.4.2
[W 2021-10-12 15:42:42.621 SingleUserNotebookApp _version:70] jupyterhub version 1.2.2 != jupyterhub-singleuser version 1.4.2. This could cause failure to authenticate and result in redirect loops!
[I 2021-10-12 15:42:42.622 SingleUserNotebookApp notebookapp:2302] Serving notebooks from local directory: /work/visual-basic-tuto
[I 2021-10-12 15:42:42.623 SingleUserNotebookApp notebookapp:2302] Jupyter Notebook 6.4.2 is running at:
[I 2021-10-12 15:42:42.623 SingleUserNotebookApp notebookapp:2302] http://jupyter-pauline-2emaury-2dlaribierevisual-2dbasdtuto-2dcb5a894d:8888/jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/
[I 2021-10-12 15:42:42.623 SingleUserNotebookApp notebookapp:2303] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[I 2021-10-12 15:42:42.633 SingleUserNotebookApp mixins:556] Updating Hub with activity every 300 seconds
[I 2021-10-12 15:42:47.899 SingleUserNotebookApp log:189] 302 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/ -> /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab? (@10.42.3.79) 2.20ms
[I 2021-10-12 15:42:48.322 SingleUserNotebookApp log:189] 302 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/ -> /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab? (@192.168.0.7) 2.19ms
[I 2021-10-12 15:42:48.386 SingleUserNotebookApp log:189] 302 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab? -> /jupyterhub/hub/api/oauth2/authorize?client_id=jupyterhub-user-pauline.maury-laribiere-visual-basic-tuto-cb5a894d&redirect_uri=%2Fjupyterhub%2Fuser%2Fpauline.maury-laribiere%2Fvisual-basic-tuto-cb5a894d%2Foauth_callback&response_type=code&state=[secret] (@192.168.0.7) 6.13ms
[I 2021-10-12 15:42:48.848 SingleUserNotebookApp auth:992] Logged-in user {'kind': 'user', 'name': 'pauline.maury-laribiere', 'admin': False, 'groups': [], 'server': None, 'pending': None, 'created': '2021-09-09T14:14:25.899266Z', 'last_activity': '2021-10-12T15:42:48.831936Z', 'servers': None}
[I 2021-10-12 15:42:48.850 SingleUserNotebookApp log:189] 302 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/oauth_callback?code=[secret]&state=[secret] -> /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab? (@192.168.0.7) 179.64ms
[I 2021-10-12 15:42:48.947 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab? (pauline.maury-laribiere@192.168.0.7) 21.76ms
[I 2021-10-12 15:42:50.208 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/kernelspecs?1634053370120 (pauline.maury-laribiere@192.168.0.7) 54.68ms
[I 2021-10-12 15:42:50.244 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings?1634053370125 (pauline.maury-laribiere@192.168.0.7) 34.96ms
[I 2021-10-12 15:42:50.245 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/kernels?1634053370130 (pauline.maury-laribiere@192.168.0.7) 31.56ms
[I 2021-10-12 15:42:50.246 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/terminals?1634053370132 (pauline.maury-laribiere@192.168.0.7) 30.94ms
[I 2021-10-12 15:42:50.248 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/sessions?1634053370131 (pauline.maury-laribiere@192.168.0.7) 31.82ms
[I 2021-10-12 15:42:50.292 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/kernelspecs?1634053370254 (pauline.maury-laribiere@192.168.0.7) 4.75ms
[I 2021-10-12 15:42:51.764 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/translations/en?1634053371359 (pauline.maury-laribiere@192.168.0.7) 370.54ms
[I 2021-10-12 15:42:52.176 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/translations/?1634053371855 (pauline.maury-laribiere@192.168.0.7) 249.29ms
[I 2021-10-12 15:42:52.184 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/listings/@jupyterlab/extensionmanager-extension/listings.json?1634053371867 (pauline.maury-laribiere@192.168.0.7) 2.93ms
[I 2021-10-12 15:42:52.647 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/nbconvert?1634053371880 (pauline.maury-laribiere@192.168.0.7) 461.34ms
[I 2021-10-12 15:42:52.649 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/git/settings?version=0.30.1&1634053371876 (pauline.maury-laribiere@192.168.0.7) 718.44ms
[I 2021-10-12 15:42:53.050 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/nbconvert?1634053371898 (pauline.maury-laribiere@192.168.0.7) 391.13ms
[I 2021-10-12 15:42:53.052 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings/@jupyterlab/shortcuts-extension:shortcuts?1634053371967 (pauline.maury-laribiere@192.168.0.7) 391.70ms
[I 2021-10-12 15:42:53.053 LabApp] Build is up to date
[I 2021-10-12 15:42:53.058 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/build?1634053371847 (pauline.maury-laribiere@192.168.0.7) 1128.85ms
[I 2021-10-12 15:42:53.059 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings/@jupyterlab/docmanager-extension:plugin?1634053371968 (pauline.maury-laribiere@192.168.0.7) 5.87ms
[I 2021-10-12 15:42:53.060 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/metrics/v1?1634053371970 (pauline.maury-laribiere@192.168.0.7) 4.69ms
[I 2021-10-12 15:42:53.061 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/metrics/v1?1634053371974 (pauline.maury-laribiere@192.168.0.7) 4.88ms
[I 2021-10-12 15:42:53.152 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/workspaces/default?1634053373120 (pauline.maury-laribiere@192.168.0.7) 3.40ms
[I 2021-10-12 15:42:53.190 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings/@jupyterlab/shortcuts-extension:shortcuts?1634053373143 (pauline.maury-laribiere@192.168.0.7) 7.55ms
[I 2021-10-12 15:42:53.243 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings?1634053373176 (pauline.maury-laribiere@192.168.0.7) 37.13ms
[I 2021-10-12 15:42:53.755 SingleUserNotebookApp log:189] 204 PUT /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/workspaces/default?1634053373719 (pauline.maury-laribiere@192.168.0.7) 3.97ms
[I 2021-10-12 15:42:53.833 SingleUserNotebookApp log:189] 200 POST /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/git/show_top_level?1634053373778 (pauline.maury-laribiere@192.168.0.7) 24.16ms
[I 2021-10-12 15:42:53.843 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/contents?content=1&1634053373806 (pauline.maury-laribiere@192.168.0.7) 7.97ms
[I 2021-10-12 15:42:53.961 SingleUserNotebookApp log:189] 200 POST /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/git/log?1634053373903 (pauline.maury-laribiere@192.168.0.7) 24.43ms
[I 2021-10-12 15:42:54.366 SingleUserNotebookApp log:189] 204 PUT /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/workspaces/default?1634053374325 (pauline.maury-laribiere@192.168.0.7) 5.48ms
[I 2021-10-12 15:42:56.240 SingleUserNotebookApp log:189] 302 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/ -> /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab? (@192.168.0.7) 2.23ms
[I 2021-10-12 15:42:56.301 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab? (pauline.maury-laribiere@192.168.0.7) 13.91ms
[I 2021-10-12 15:42:57.076 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/kernelspecs?1634053377040 (pauline.maury-laribiere@192.168.0.7) 5.05ms
[I 2021-10-12 15:42:57.112 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings?1634053377045 (pauline.maury-laribiere@192.168.0.7) 33.98ms
[I 2021-10-12 15:42:57.115 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/kernels?1634053377052 (pauline.maury-laribiere@192.168.0.7) 2.51ms
[I 2021-10-12 15:42:57.116 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/sessions?1634053377054 (pauline.maury-laribiere@192.168.0.7) 2.37ms
[I 2021-10-12 15:42:57.117 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/terminals?1634053377055 (pauline.maury-laribiere@192.168.0.7) 2.34ms
[I 2021-10-12 15:42:57.121 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/workspaces/auto-V?reset (pauline.maury-laribiere@192.168.0.7) 4.12ms
[I 2021-10-12 15:42:57.163 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/kernelspecs?1634053377101 (pauline.maury-laribiere@192.168.0.7) 3.27ms
[I 2021-10-12 15:42:57.834 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/kernelspecs?1634053377798 (pauline.maury-laribiere@192.168.0.7) 4.28ms
[I 2021-10-12 15:42:57.839 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/kernels?1634053377806 (pauline.maury-laribiere@192.168.0.7) 2.70ms
[I 2021-10-12 15:42:57.872 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings?1634053377802 (pauline.maury-laribiere@192.168.0.7) 32.14ms
[I 2021-10-12 15:42:57.873 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/terminals?1634053377808 (pauline.maury-laribiere@192.168.0.7) 27.35ms
[I 2021-10-12 15:42:57.875 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/sessions?1634053377807 (pauline.maury-laribiere@192.168.0.7) 1.16ms
[I 2021-10-12 15:42:57.908 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/kernelspecs?1634053377868 (pauline.maury-laribiere@192.168.0.7) 4.12ms
[I 2021-10-12 15:42:59.399 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/translations/en?1634053378999 (pauline.maury-laribiere@192.168.0.7) 367.32ms
[I 2021-10-12 15:42:59.677 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/translations/?1634053379436 (pauline.maury-laribiere@192.168.0.7) 197.74ms
[I 2021-10-12 15:42:59.681 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/listings/@jupyterlab/extensionmanager-extension/listings.json?1634053379447 (pauline.maury-laribiere@192.168.0.7) 196.35ms
[I 2021-10-12 15:43:00.089 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/nbconvert?1634053379460 (pauline.maury-laribiere@192.168.0.7) 402.92ms
[I 2021-10-12 15:43:00.091 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/git/settings?version=0.30.1&1634053379456 (pauline.maury-laribiere@192.168.0.7) 407.30ms
[I 2021-10-12 15:43:00.091 LabApp] Build is up to date
[I 2021-10-12 15:43:00.097 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/build?1634053379431 (pauline.maury-laribiere@192.168.0.7) 635.29ms
[I 2021-10-12 15:43:00.441 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/nbconvert?1634053379480 (pauline.maury-laribiere@192.168.0.7) 347.27ms
[I 2021-10-12 15:43:00.445 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings/@jupyterlab/shortcuts-extension:shortcuts?1634053379547 (pauline.maury-laribiere@192.168.0.7) 351.09ms
[I 2021-10-12 15:43:00.458 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/metrics/v1?1634053379550 (pauline.maury-laribiere@192.168.0.7) 9.96ms
[I 2021-10-12 15:43:00.461 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings/@jupyterlab/docmanager-extension:plugin?1634053379548 (pauline.maury-laribiere@192.168.0.7) 10.24ms
[I 2021-10-12 15:43:00.462 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/metrics/v1?1634053379553 (pauline.maury-laribiere@192.168.0.7) 6.26ms
[I 2021-10-12 15:43:00.625 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings?1634053380551 (pauline.maury-laribiere@192.168.0.7) 46.00ms
[I 2021-10-12 15:43:00.630 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/settings/@jupyterlab/shortcuts-extension:shortcuts?1634053380585 (pauline.maury-laribiere@192.168.0.7) 3.57ms
[I 2021-10-12 15:43:01.125 SingleUserNotebookApp log:189] 204 PUT /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/workspaces/auto-V?1634053381087 (pauline.maury-laribiere@192.168.0.7) 3.90ms
[I 2021-10-12 15:43:01.203 SingleUserNotebookApp log:189] 200 POST /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/git/show_top_level?1634053381147 (pauline.maury-laribiere@192.168.0.7) 24.34ms
[I 2021-10-12 15:43:01.226 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/contents?content=1&1634053381183 (pauline.maury-laribiere@192.168.0.7) 7.52ms
[I 2021-10-12 15:43:01.350 SingleUserNotebookApp log:189] 200 POST /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/git/log?1634053381298 (pauline.maury-laribiere@192.168.0.7) 19.74ms
[I 2021-10-12 15:43:01.743 SingleUserNotebookApp log:189] 204 PUT /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/api/workspaces/auto-V?1634053381706 (pauline.maury-laribiere@192.168.0.7) 5.50ms
[E 2021-10-12 15:43:02.555 SingleUserNotebookApp web:1789] Uncaught exception GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/vscode/ (192.168.0.7)
    HTTPServerRequest(protocol='https', host='health.renkulab.datascience.ch', method='GET', uri='/jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/vscode/', version='HTTP/1.1', remote_ip='192.168.0.7')
    Traceback (most recent call last):
      File "/opt/conda/lib/python3.9/site-packages/tornado/web.py", line 1704, in _execute
        result = await result
      File "/opt/conda/lib/python3.9/site-packages/jupyter_server_proxy/websocket.py", line 91, in get
        return await self.http_get(*args, **kwargs)
      File "/opt/conda/lib/python3.9/site-packages/jupyter_server_proxy/handlers.py", line 543, in http_get
        return await ensure_async(self.proxy(self.port, path))
      File "/opt/conda/lib/python3.9/site-packages/jupyter_server/utils.py", line 180, in ensure_async
        result = await obj
      File "/opt/conda/lib/python3.9/site-packages/jupyter_server_proxy/handlers.py", line 537, in proxy
        await self.ensure_process()
      File "/opt/conda/lib/python3.9/site-packages/jupyter_server_proxy/handlers.py", line 502, in ensure_process
        cmd = self.get_cmd()
      File "/opt/conda/lib/python3.9/site-packages/jupyter_server_proxy/config.py", line 63, in get_cmd
        return self._realize_rendered_template(command)
      File "/opt/conda/lib/python3.9/site-packages/jupyter_server_proxy/config.py", line 58, in _realize_rendered_template
        call_with_asked_args(attribute, self.process_args)
      File "/opt/conda/lib/python3.9/site-packages/jupyter_server_proxy/utils.py", line 34, in call_with_asked_args
        return callback(*asked_arg_values)
      File "/opt/conda/lib/python3.9/site-packages/jupyter_vscode_proxy/__init__.py", line 9, in _get_vscode_cmd
        raise FileNotFoundError("Can not find code-server in PATH")
    FileNotFoundError: Can not find code-server in PATH
[E 2021-10-12 15:43:02.595 SingleUserNotebookApp log:181] {
      "Via": "1.1 proxy.admin.ch",
      "Cookie": "jupyterhub-user-pauline.maury-laribiere-visual-basic-tuto-cb5a894d=[secret]; experimentation_subject_id=[secret]; sidebar_collapsed=[secret]; FTNT-EP-FG3K6ETB19900142=[secret]; session=[secret]; known_sign_in=[secret]; jupyterhub-session-id=[secret]; _xsrf=[secret]",
      "Accept-Language": "fr,fr-FR;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
      "Accept-Encoding": "gzip, deflate, br",
      "Referer": "https://health.renkulab.datascience.ch/jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/lab/workspaces/auto-V",
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36 Edg/91.0.864.71",
      "Sec-Fetch-Dest": "document",
      "Sec-Fetch-User": "?1",
      "Sec-Fetch-Mode": "navigate",
      "Sec-Fetch-Site": "same-origin",
      "Upgrade-Insecure-Requests": "1",
      "Sec-Ch-Ua-Mobile": "?0",
      "Sec-Ch-Ua": "\" Not;A Brand\";v=\"99\", \"Microsoft Edge\";v=\"91\", \"Chromium\";v=\"91\"",
      "X-Scheme": "https",
      "X-Forwarded-Proto": "https,http",
      "X-Forwarded-Port": "443,80",
      "X-Forwarded-Host": "health.renkulab.datascience.ch",
      "X-Forwarded-For": "192.168.0.7,::ffff:10.42.1.0",
      "X-Real-Ip": "192.168.0.7",
      "X-Request-Id": "bc137baec96054b1c917d6bb54de392b",
      "Host": "health.renkulab.datascience.ch",
      "Connection": "close"
    }
[E 2021-10-12 15:43:02.595 SingleUserNotebookApp log:189] 500 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/vscode/ (pauline.maury-laribiere@192.168.0.7) 43.40ms
[I 2021-10-12 15:43:09.011 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/metrics/v1?1634053388976 (pauline.maury-laribiere@192.168.0.7) 4.05ms
[I 2021-10-12 15:43:09.017 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/metrics/v1?1634053388978 (pauline.maury-laribiere@192.168.0.7) 3.52ms
[I 2021-10-12 15:43:11.010 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/terminals?1634053390970 (pauline.maury-laribiere@192.168.0.7) 4.36ms
[I 2021-10-12 15:43:11.014 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/sessions?1634053390971 (pauline.maury-laribiere@192.168.0.7) 7.07ms
[I 2021-10-12 15:43:11.019 SingleUserNotebookApp log:189] 200 GET /jupyterhub/user/pauline.maury-laribiere/visual-basic-tuto-cb5a894d/api/kernels?1634053390969 (pauline.maury-laribiere@192.168.0.7) 3.42ms

Thanks! Looks like the code-server is not properly installed - could you check the image build job in gitlab to see if any errors came up during installation?

Yes, here it is image_build (#298732) · Jobs · Pauline Maury Laribière / Metadata Auto · GitLab (renkulab.io)
Apparently, it is not found.

Step 3/7 : RUN curl -s https://raw.githubusercontent.com/SwissDataScienceCenter/renkulab-docker/master/scripts/install-vscode.sh | bash
 ---> Running in e9834b3bcd81
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   645  100   645    0     0   1557      0 --:--:-- --:--:-- --:--:--  1561
100 71.6M  100 71.6M    0     0  19.8M      0  0:00:03  0:00:03 --:--:-- 24.0M
ln: failed to create symbolic link '/home/jovyan/.local/bin/code-server': No such file or directory
bash: line 13: code-server: command not found
Collecting pylint
  Downloading pylint-2.11.1-py3-none-any.whl (392 kB)

Hi Pauline.

Apologies for the bug! I believe it arises from some of the recent upgrades to our Docker images that alter some of the environment variables.

@tao.sun has found a quick fix which we believe should allow VSCode to run: add the following two lines above the line you used to get the install code:

RUN mkdir -p $HOME/.local/bin
ENV PATH=$PATH:$HOME/.local/bin

The full sample Docker file is here: Dockerfile · class_apis · Tao Sun / Metadata Auto · GitLab.

Please give it a go and let us know if it works for you. In the mean time we will work on a more user friendly fix.

Cheers

1 Like

Thanks for the quick fix, it works :smiley:

1 Like

This is quite welcome. Are there any plans to offer this as an option in the session configuration? (e.g. /lab /rstudio /vscode)?

2 Likes

Hi @a_user - because adding VSCode bloats the Docker image quite a bit (~1GB) we’re unlikely to offer that as a default. We do plan to make it easier to add to use images, however. If you have added VSCode to your image, you can of course make the default landing URL /vscode and then your session will go directly there.

As a side note - the upgrades that we undertook today (and that are still going through some growing pains) mean that we are no longer reliant on Jupyter-based images. So we may in the future offer base image without Jupyter but with VSCode inside (the whole Jupyter stack also adds quite a bit of bloat…). Same is true for R-specific images/sessions.

Ah I think I see what you mean - in the project settings page, you only have the option of selecting /lab or /rstudio:

image

Yes, we have plans to make this more configurable so you could e.g. enter your own default if you wanted or we could perhaps determine that the image contains VSCode and offer it as an option. It’s not on our immediate roadmap but when we revisit this page, we will also reconsider this aspect of it.

In the meantime, you can do it by hand by editing the .renku/renku.ini file in your project like this, for example:

[renku "interactive"]
default_url = /vscode

Thanks, that’s great and yes, I meant primarily the settings selection. Editing the ini works for me (same as for pinning the image etc). Building our own images to include vscode is also easy enough.

Thanks @PaulineML for bringing this bug to our attention (and @tao.sun and @gavin-k-lee for sorting out the fix)! It’s been fixed now in the base image and following the instructions above with the latest image renku/renkulab-py:3.9-0.10.3 should work out-of-the-box. :tada:

1 Like