We do Jupyter from Conda and it works great. We package the Python environment into an Lmod module, and stay away from Virtual Environments for several reasons listed below.
One of the caveats is that the virtual environments do have problems, since you need to register each virtual environment into the Jupyter separately (see the last paragraph of https://www-test.chpc.utah.edu/documentation/software/jupyterhub.php).
In case of OOD, we’d have to have 2 Lmod modules, one to load the base Anaconda and other to load the virtual environment. I consider that to be a hassle (the VE initialization does plug into the module syntax nicely), our users would need to get educated to write the VE module, or they would have to activate the VE in the OOD webform. Plus, I have seen problems with that before which details I don’t remember, so, my recommendation is to have multiple Anaconda (miniconda) installations, one for each VE you’d want to run, each loadable by separate Lmod module, https://www.chpc.utah.edu/documentation/software/python-anaconda.php#mi. The miniconda install is simple as is a modification of its Lmod module.
Then, in OOD, we have a text box that allows users to put in any environment commands they want (credit to Yale for giving us that suggestion), https://www.chpc.utah.edu/documentation/software/ondemand.php#oodjupyter.
Our OOD app is at https://github.com/CHPC-UofU/bc_osc_jupyter