How to Deploy from Container Images

App Platform is a Platform-as-a-Service (PaaS) offering that allows developers to publish code directly to DigitalOcean servers without worrying about the underlying infrastructure.


You can deploy containerized apps to App Platform from supported container registries. App Platform currently supports deploying public and private images from DigitalOcean Container Registry, Docker Hub, and GitHub Container Registry.

Note
You must have an Owner or Maintainer permissions-role in any GitHub repository that you want to access from App Platform.

Deploy Resource using a Container Image as the Source

To deploy an app from a container registry from the DigitalOcean Control Panel, click the Create button and then select the Apps option.

Create Resource From Source Code

On the Create Resource From Source Code screen, select your container registry service, either DigitalOcean Container Registry, Docker Hub, or GitHub Container Registry. Selecting any of these options opens additional fields on the screen.

In the Repository field, select the repository that hosts your app’s image. After selecting a repository, you can optionally choose to deploy an image with a specific tag or digest hash by entering it into the Image tag or digest field. If you do not enter a tag, the field defaults to the latest tag.

If you choose the Docker Hub or GitHub Registry option, you can enter your credentials to access private images. If your image is public, you do not need to enter your credentials. Credentials are entered using the following syntax: username:token or username:password.

If you are using DigitalOcean Container Registry, select the Autodeploy option to have App Platform automatically redeploy your app each time a new image with the specified tag is pushed to your repository.

Note
App Platform does not support auto-deployment of images from Docker Hub repositories or from GitHub Registry. If you need to auto deploy for your images, consider using DigitalOcean Container Registry.

Once you have entered your repo’s information, click Next.

Resources

Resources are deployable runtime software elements in your app. A resource can be a database, a service, a worker, or a static site. On the Resources page, you can change the plan, configure resource settings or create new resources for your app.

Change Plan

Click the Edit Plan button on the Resources screen to scale the app’s resources.

Scale app

On the Edit Plan screen, you can select one of the following plans as well as scale the app resources vertically by increasing the amount of CPU and memory or horizontally by adding more container instances:

  • Starter - You can only select the Starter plan to host static websites, such as Hugo sites.
  • Basic - Basic plans allow for only one container, vertical scaling, and less outbound transfer and build minutes than the Pro plan. Use the Basic plan for small-scale apps or prototyping your app. Specify the size of the container in the Size section.
  • Pro - The Pro plan includes all of the attributes of the Basic plan and adds more build minutes, horizontal scaling, and high availability. Use the Pro plan to deploy a fully production-ready iteration of your app. Select the number of containers you would like your app to run in the Containers section. Adding additional containers horizontally scales your app to make it more highly available.

Configure Scaling

Under each applicable component on the Edit Plan page, you can set the number of containers the component uses.

Alternatively, enable autoscaling to allow your app to automatically add or remove containers. Autoscaling sets the minimum and maximum number of containers based on the average CPU usage of the app’s containers.

Note
Autoscaling is currently in Early Availability.

See How to Scale Apps in App Platform for more information on scaling.

Autoscaling is only available for app components using dedicated CPUs.

The Web Services menu with a sample app component selected. The component's scaling options are set to autoscale.

As you change the size or the number of containers, the Monthly App Cost section updates to give you an overview of the app’s monthly cost. If you’ve enabled autoscaling, the monthly total becomes a range between the possible minimum and maximum cost per month.

For static sites, the Scale screen displays the number of apps on your account, the static site’s name, and other resources.

After you configure your scaling settings, click Back to go back to the Resources screen.

Configure Resource Settings

To configure the app resource settings, click the edit icon corresponding to the resource on the Resources screen.

App configuration options

App Platform presents several configuration options, several of which may be auto-filled by the app’s detection. You can configure the following options for your app:

  • Name - Unique name for the resource.

  • Resource Type - The type of app to be deployed, either a web service, static site, or worker service. This field determines which additional configuration options are available for your app on this screen.

  • Build Command - Custom build commands to run upon deployment.

  • Run Command - For web and worker services only. You can specify custom run commands for the application to run after deployment. If no run commands are specified, the default run command for your app’s language is used, such as npm start for a Node.js app.

  • HTTP Port - For web services only. The port that the app receives HTTP requests on. The default port is 8080.

  • HTTP Request Routes - For web services and static sites only. The URL path where the app can be accessed, such as your-app-v3cl4.ondigitalocean.app/api. If not specified, the app is accessible from the provided hostname’s root.

  • Output Directory - For static sites only. An optional path to where the build assets are located, relative to the build context. If not set, App Platform automatically scans for these directory names: _static, dist, public, build.

App Platform displays build and run commands that it detects, which you can customize as needed. Refer to the cloud-native buildpacks for instructions for specific buildpacks. For Dockerfile-based builds, entering a run command overrides the Dockerfile’s entrypoint.

After you configure the resource settings, click Back to go back to the Resources screen.

Create New Resources

Once you configure your app, you can optionally create additional resources for the app. In the Create Resource section of the Resources screen, select the type of resource in the Resource Type section.

Add resource
  • For service, worker, or static site: Select the Detect from Source Code option and click Create. Select the resource from your repository, container registry, or sample app and click Next.

  • For database: Select the Database option and click Next. Choose the Dev Database option to connect a small development-level PostgreSQL database to your app and click Create and Attach. We do not recommend using this initial size for production-ready apps, but you can upgrade the database to a production-ready size at a later time. Alternatively, you can select the Previously Created DigitalOcean Database option and click Attach Database to attach an existing DigitalOcean database to your app as a resource. All DigitalOcean database clusters support apps as trusted sources. This creates a secure connection to the database and it accepts traffic only from the app.

The new resources are added to your app and appear on the Resources screen.

New resources added

Once you configure the resources, click Next.

Environment

If your app requires environment variables, such as the app’s URL or database connection strings, you can define them in this section. These can be runtime and build time environment variables. We also provide several app-specific dynamic environment variables that the app can reference. App-level variables can be accessed by all resources in your app.

On the Environment screen, click the corresponding Edit link to specify app-level or resource-specific environment variables. Click the Encrypt checkbox to obscure the variable’s values from all build, deployment, and application logs.

Once you configure the environment variables, click Next.

Info

On the Info screen, click Edit to specify the name of your app and the project your app belongs to. The name can only contain lowercase alphanumeric characters and dashes.

In the Region field, select a datacenter region for the app to reside in. For performance purposes, it is best to select the region geographically closest to the app’s user base.

You cannot select a region for static sites. Static resources are served on DigitalOcean’s global CDN.

Once you enter a name for your app and select a region, click Next.

Review

On the Review screen, review your app’s resources, environment variables and billing information and then click Create Resources.

Once your app deploys, you can view the app at the URL at the top of the app’s Overview page.

The app's provided URL above the Overview page

Change the Tag of the Container Source After Deployment

You can change the tag and autodeploy settings of the container image to use as the source of an existing deployment.

To do this, navigate to the Apps page, click your app, and then click the Settings tab.

Select the resource that you created using a container from your registry. Under the Source heading, click the Edit link, then use the Tag drop-down to select the desired tag.

Use the Autodeploy checkbox to set your autodeploy preferences. Press Save to save the new settings and re-deploy your app.

Deploy Container using the App’s Spec

You can also deploy an image from a container registry using an app’s spec.

To do this, edit your app’s spec to include an image object. The image object can contain the following fields:

  • registry_type: A value specifying the container registry’s service. Valid values are DOCR for DigitalOcean Container Registry, DOCKER_HUB for Docker Hub, and GHCR for GitHub Container Registry.
  • registry: A string specifying the registry’s name. For DOCKER_HUB and GHCR, this is the organization in which the image lives.
  • repository: A string specifying the image repository’s name.
  • registry_credentials: The credentials required to access a private Docker Hub or GitHub registry, in the following syntax "$username:$token". We recommend using a token that doesn’t expire and a scope limited to reading the app’s repository. Review GitHub and Docker Hub’s documentation to see how this is done.
  • digest: A string specifying the image’s hash. This cannot be used with the tag field.
  • tag: A string specifying the image’s tag. Cannot be used with the digest field.
  • deploy_on_push: An object containing a boolean indicating whether App Platform redeploys the app when it detects a push to the image’s repository. Can only be used with DigitalOcean Container Registry. The object looks like this:
deploy_on_push:
  enabled: true

The following example deploys an image from a private Docker Hub registry using an image digest:

    
        
            
name: front-end
services:
- name: web
  image:
    registry_type: DOCKER_HUB
    registry: example-registry
    repository: example-repo
    registry_credentials: "your_username:2YotnFZFEjr1zCsicMWpAA"
    digest: sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef

        
    

The registry_credentials field requires you to initially submit your access credentials in clear text, but App Platform then encrypts and stores these values similar to secret environment variables. After submitting the spec, App Platform replaces the values in the spec with encrypted values. Once the values are encrypted, you can safely store the spec in the app’s repo.

Once you have edited the app’s spec to include an image object, either upload the spec using the control panel, apply it using doctl, or push the spec to your repo to trigger a deployment.