Skip to content

Configuring a Workshop Image

Orchestra runs each workshop session behind two authentication layers, so the application inside the pod must start unauthenticated. You don’t need to build a custom image for this — point a template at a stock upstream image and configure it with the template’s App Port, Environment variables, and Container args fields.

Every session is fronted by oauth2-proxy (at the ingress, establishes who the user is) and the per-pod Orchestra sidecar (enforces session ownership). By the time a request reaches your app, it’s already authenticated. If the app also requires a login, participants get a confusing second prompt — and in the proxied setup they often can’t satisfy it (e.g. a JupyterLab token they never see). So the app must:

  1. start with its own auth disabled, and
  2. listen on a single HTTP port, set as the template’s App Port (the sidecar proxies to http://localhost:<port>).
  • App Port — the port the app listens on. RStudio: 8787. JupyterLab: 8888.
  • Environment variables — one KEY=value per line. Merged on top of the operator’s defaults (DISABLE_AUTH, ROOT), with your values winning.
  • Container args — one argument per line. Replaces the image’s default command (CMD) while keeping its entrypoint.

Stock rocker/rstudio and bioconductor/bioconductor_docker images work with no env or args — the operator already injects DISABLE_AUTH=true and ROOT=true, which rocker honors to skip the login.

  • App Port: 8787
  • Environment variables: (empty)
  • Container args: (empty)

To re-enable the RStudio login for some reason, override the default:

DISABLE_AUTH=false
  1. Save the template, then launch a session from it.

  2. Confirm the spec carries your values:

    Terminal window
    kubectl get workshop <name> -o jsonpath='{.spec.port} {.spec.env} {.spec.args}{"\n"}'
  3. Confirm the app container got them, and the sidecar targets the right port:

    Terminal window
    kubectl get pod <pod> -o jsonpath='{range .spec.containers[*]}{.name}: env={.env[*].name} args={.args}{"\n"}{end}'
  4. Open the session URL — you should land directly in RStudio/JupyterLab with no in-app login prompt (oauth2-proxy still guards the front door).

The contract is image-agnostic. Any image works as long as it can start without authentication and listen on one HTTP port — set that port as App Port, and use env/args to turn off whatever login it ships with.