---
title: "Deploy a Docker container over MCP with while.sh"
url: https://while.sh/en/guides/deploy-docker-container/
author: "Aloïs Oddon, co-founder of Nextmap"
updated: 2026-11-02
---

# Deploy a Docker container from your AI agent, over MCP

Does your project have a Dockerfile? Connected to while over MCP, your AI agent deploys it as is, over HTTPS, whatever the language.

## Prerequisites

- A project with its Dockerfile, in any language.
- An AI agent that works in a terminal: Claude Code, Codex, Cursor or Gemini CLI.

## Step 1: Give your agent these instructions

Open your agent in your app's folder, and paste these instructions into it:

```text titre="Instructions"
Connect to while with my account (while.sh/agents), then deploy my app.
```

Without an account, your agent deploys your app as a trial, in one request. To keep it, open the link it gives you and create your account.

With your account, your agent adds while's MCP server itself. If it asks you to, restart it. On the first call to while, a page opens in your browser. In Claude Code, if it doesn't open, type /mcp, choose while, then Authenticate. On that page, choose your app, or "A new app", then click Authorize.

## Step 2: Open your app

Your agent gives you your app's address, for example `https://mon-appli.while.cloud`, over HTTPS.

## What your agent does

It writes while.yaml next to your Dockerfile:

```yaml titre="while.yaml"
apiVersion: while/v1
project: mon-appli
services:
  - name: web
    port: 8080
    health:
      path: /
```

Your Dockerfile builds the image of each version, and your container never runs as root, even if the Dockerfile leaves out the `USER` line. This one serves a page in Python, on the port it receives in `PORT` (source 1):

```dockerfile titre="Dockerfile"
FROM python:3.12-slim
WORKDIR /app
COPY index.html .
USER 1000:1000
CMD ["sh", "-c", "python -m http.server ${PORT:-8080} --bind 0.0.0.0"]
```

## Deploy an image that is already built

> You, to your agent: Deploy the image our CI just built.

Your agent deploys the image as is, by its digest, without rebuilding it.

## Fix the vulnerabilities in your image

> You, to your agent: Fix the vulnerabilities in our image.

The packages in your image, system packages included, are checked against known vulnerabilities at every deployment, then every day. Your agent is warned about a serious vulnerability, and updates your image.

## Add a database

> You, to your agent: Add a PostgreSQL database.

Your agent declares the database in while.yaml, and its address reaches your code in `DATABASE_URL`. It is backed up every day, and can go back to a precise moment if needed.

## Restrict your app to your colleagues

> You, to your agent: Restrict the app to people in the company.

Your agent adds two lines to the service:

```yaml titre="while.yaml"
    access: internal
    email_domains: [acme.com]
```

Once your Google Workspace or Microsoft 365 is linked to while, on the Pro plan, your colleagues open it with their usual account, and your code receives their name and email address, with no sign-in page to write.

## Move to your own domain

> You, to your agent: Put the app on planning.acme.com.

Your agent declares the domain, you add the DNS records it gives you, and the HTTPS certificate follows.

## Go back to the previous version

> You, to your agent: Go back to the previous version.

In the 30 minutes after a deployment, the previous version comes back in a second. After that, it takes a few seconds. Once the previous version is back, your agent reads what broke in while's logs, fixes it and deploys again.

## Next steps

- [Deploy a Node.js API and its PostgreSQL database](/en/guides/deploy-node-api-postgresql/)
- [Run a scheduled job](/en/guides/run-cron-job/)
- [Compare the hosts that have an MCP server](/en/comparisons/mcp-hosting-claude-code/)

## Sources

1. [Docker, the Dockerfile reference (CMD, exec form and variables)](https://docs.docker.com/reference/dockerfile/), 2026-11-01

## Questions

### Which languages?

All of them: Rails, Laravel, Spring, .NET, Rust or anything else, as long as there is a Dockerfile.

### Which port should my container listen on?

On the one in while.yaml, which it receives in the PORT variable, and on all its addresses.

### Do my tests run before the deployment?

Yes, if your Dockerfile has a stage named test: it runs first, and if it fails, the deployment stops.
