# Applications

Applications are docker containers that include all dependencies to run a system.  These are provided by hardware vendors or uploaded by the tenant.

* [Application Catalog](#application-catalog)
* [Creating an Application](#creating-an-application)
* [Viewing Applications](#viewing-applications)
* [Managing Applications](#managing-applications)
* [Custom Applications](#custom-applications)

## Application Catalog

The catalog contains versioned apps that Denvr has selected for various uses.  They are focused on data scientists who prefer a fast-start environment like PyTorch, RAPIDS, and JAX along with a JupyterLab.

{% hint style="info" %}
Denvr can setup new applications as requested including specific versions.
{% endhint %}

<figure><img src="/files/TVzYHR9Cwy29DL6j4eXk" alt=""><figcaption></figcaption></figure>

## Creating an Application

Denvr AI Cloud has a single page view to create applications including all of the configuration options that are relevant.

### Basic information

This section provides essential details for setting up a container, including the instance name and where resources are allocated from.

<figure><img src="/files/TkFKRQFD1rqJoMacDqcR" alt=""><figcaption></figcaption></figure>

<table data-header-hidden><thead><tr><th width="203"></th><th></th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>Refers to the unique identifier or label for the application. It helps users manage and track different containers within their infrastructure.</td></tr><tr><td><strong>Resource pool</strong></td><td>Defines how compute resources are allocated, either <strong>on-demand</strong> for dynamic allocation or <strong>reserved</strong> for dedicated single-tenant resources.</td></tr></tbody></table>

### Application

This section provides different pre-defined versions of the application to be selected

<figure><img src="/files/rwTnJkP3YBHMbpg83C56" alt=""><figcaption></figcaption></figure>

<table data-header-hidden><thead><tr><th width="196"></th><th></th></tr></thead><tbody><tr><td><strong>Release</strong></td><td>Select a specific version of the container.  This also displays the docker hub source repository used.</td></tr></tbody></table>

### Instance type

Defines the overall configuration of the application container, including the type of hardware (such as GPU or CPU), performance characteristics, and resource allocation.

<figure><img src="/files/WBwqMRsuwGlLbKi5o31o" alt=""><figcaption></figcaption></figure>

<table data-header-hidden><thead><tr><th width="203"></th><th></th></tr></thead><tbody><tr><td><strong>GPU platform</strong></td><td>Refers to the type of GPU hardware available for running AI and computational tasks. Different platforms offer varying levels of performance and specialization for different workloads.</td></tr><tr><td><strong>CPU platform</strong></td><td>Refers to the type of central processing unit (CPU) hardware available for provisioning. Different CPU platforms offer varying levels of performance for general-purpose computing, suited for tasks that do not require specialized GPU acceleration.</td></tr><tr><td><strong>Instance size</strong></td><td>Defines the specific resource allocation, including the number of GPUs, CPUs, memory, and storage, for a virtual machine. It determines the power and capacity of the compute environment.</td></tr></tbody></table>

### Additional storage

File volumes can be automatically attached to your machine instances. Volumes can be accessed my multiple instances simultaneously.

<figure><img src="/files/v7SFBuS0QSky37wtfFzD" alt=""><figcaption></figcaption></figure>

<table data-header-hidden><thead><tr><th width="196"></th><th></th></tr></thead><tbody><tr><td><strong>Personal</strong></td><td>This is dedicated storage that is only accessible by the specific user, ensuring privacy and security. It is mounted to a unique directory path (e.g., <code>/home/ubuntu/personal</code>).</td></tr><tr><td><strong>Tenant shared</strong></td><td>This storage is accessible by multiple users or virtual machines within the same tenant. It is mounted to a shared directory path (e.g., <code>/home/ubuntu/tenant-shared</code>), enabling collaboration and shared access.</td></tr></tbody></table>

### Access credentials

Containers support secure access using Jupyter Authentication Tokens for JupyterLab and optional SSH keys for passwordless login. Enable SSH to manage the environment securely with the default user ID and added SSH keys.

<figure><img src="/files/uDfmZ6rTPwZtyEEoXYzN" alt=""><figcaption></figcaption></figure>

<table data-header-hidden><thead><tr><th width="196"></th><th></th></tr></thead><tbody><tr><td><strong>Jupyter Authentication Token</strong></td><td>Applications that include JupyterLab require a shared password for basic authorization.  Please select a difficult password for better security.</td></tr><tr><td><strong>SSH Keys</strong></td><td>SSH (Secure Shell) keys are cryptographic keys used to authenticate access to the application. Users can enter or add additional SSH keys as required.</td></tr></tbody></table>

### Launch application

The right panel shows the application summary.  Press `Launch Application` to create the virtual machine.

<figure><img src="/files/GDG9JsQNfx7eapCxc8ow" alt="" width="328"><figcaption></figcaption></figure>

## Viewing Applications

The application detail screen provides an overview of the selected application, including its online status, options to start, stop, or delete, and a direct link to access the JupyterLab interface. Key information about the application, such as instance details, type, hardware configuration, and network settings, is displayed for easy management and monitoring.

<figure><img src="/files/uqSVZSw9ug8cVSnobKIq" alt=""><figcaption></figcaption></figure>

## Managing applications

The Applications overview screen displays all running containers and provides fast access to lifecycle actions and access to the JupyterLab interface.

<figure><img src="/files/Ca1yTZaPirvgmjhbSud3" alt=""><figcaption></figcaption></figure>

## Custom Applications

> **Note:** This feature is in beta and currently has two restrictions:
>
> 1. Custom applications can only be deployed on reserved nodes
> 2. The  image must run a process that keeps the container alive

From the application catalog you can also specify a custom application.&#x20;

When launching a custom application you'll need to specify:

1. The registry provider (e.g., docker, github, etc)
2. Whether it is a public or private registry
3. Image URL to pull from
4. Username and password/token for private registries
5. Optional user scripts to be mounted for use in CMD or ENTRYPOINT
6. Optional environment variables to be added
7. Optional proxy port to route https traffic from port 443
8. Optional readiness port to check when your container is online
9. Optional image CMD override

<figure><img src="/files/c6QngvFdZ5HBvZXz3nBh" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4AASIPZsL0gX6EsqNJp2" alt=""><figcaption></figcaption></figure>

### FAQ

A few tips to help you get started with custom applications

#### CMD Overrides

Inputs should follow the [docker exec form.](https://docs.docker.com/reference/dockerfile/#exec-form) Provide each part of the command as a separate element in the array, unless you explicitly want a shell to interpret the string.\
\
**Invalid**

`["jupyter notebook --ip=0.0.0.0"]`&#x20;

**Valid**

1. `["jupyter", "notebook", "--ip=0.0.0.0"]`&#x20;
2. `["/bin/bash", "-c", "jupyter notebook --ip=0.0.0.0"]`
3. `["/bin/bash", "-c", "echo starting; jupyter notebook && echo ending"]`

NOTES:

* In the invalid case, the CMD is read as a one argument, which leads to errors.
* In all of the valid cases, each argument is passed as a string to a command.
* During chaining, `&&` and `;` are used for conditional and unconditional evaluation. See the [bash manual](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Conditional-Constructs) for more details.

#### Debugging

Container logs do not persist beyond the lifetime of an application. To debug applications we recommend including/starting a remote access service (`sshd`) and then running a command that keeps the applications running. Ex)

`["/bin/bash", "-c", "sleep infinity"]`

**NOTE**&#x20;

In this case, any commands after `sleep infinity`will not be executed.

**Tip**

Use a tool like [tini](https://github.com/krallin/tini) to reap zombie process and prevent process table exhaustion.

#### Storage

Direct attached and additional storage is mounted at `/mnt`inside your application. For catalog applications, a symlink to `/hom/ubunu`is also provided for your convenience. See our documentation on [storage tiers](/docs/platform/storage.md) for more details.

#### Readiness Ports

The readiness port just tells Denvr when your application (or virtual machine) is online and accessible. This does not control or restrict what ports are exposed/accessible. See our section on [provisioning states ](/docs/additional-information/faqs/provisioning-states.md)for more details.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.denvrdata.com/docs/platform/applications.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
