Deploy to Google Cloud Run
Cloud Run runs containers on demand, scales to zero when idle, and charges only for active request time. It's what Axon Cloud itself runs on.
1. Build
axon build
# → .agent/image.tar
2. Push to Artifact Registry
gcloud auth login
gcloud config set project YOUR_PROJECT_ID
# Create a repository if you don't have one
gcloud artifacts repositories create agents \
--repository-format=docker \
--location=europe-west1
# Load and push
docker load < .agent/image.tar
docker tag my-agent europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest
gcloud auth configure-docker europe-west1-docker.pkg.dev
docker push europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest
3. Deploy
gcloud run deploy my-agent \
--image europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest \
--region europe-west1 \
--port 3000 \
--allow-unauthenticated \
--set-env-vars AXON_API_KEY=axon_...
Add any other keys your agent needs with --set-env-vars KEY=value,KEY2=value2.
4. Set secrets (recommended)
For production, store secrets in Secret Manager instead of passing them inline:
echo -n "axon_..." | gcloud secrets create AXON_API_KEY --data-file=-
echo -n "ghp_..." | gcloud secrets create GITHUB_TOKEN --data-file=-
gcloud run deploy my-agent \
--image europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest \
--region europe-west1 \
--port 3000 \
--allow-unauthenticated \
--set-secrets AXON_API_KEY=AXON_API_KEY:latest,GITHUB_TOKEN=GITHUB_TOKEN:latest
Cloud Run prints your service URL when the deployment completes.
Subsequent deploys
Push a new image and redeploy:
axon build
docker load < .agent/image.tar
docker tag my-agent europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest
docker push europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest
gcloud run deploy my-agent --image europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest