Skip to main content

Add your description here

Project description

Google Cloud Build & Deploy Guide

A step-by-step guide for students to build Docker images and deploy them to Google Cloud Run.

Prerequisites

  • Docker installed on your machine
  • A Google Cloud account
  • A project with Docker files ready to deploy

Step 1: Setup Google Cloud Project

Create a new project (if needed)

# Template
gcloud projects create <PROJECT_ID> --name="<PROJECT_NAME>"

# Example
gcloud projects create technova-mcp-server --name="Technova MCP Server"

Set your project as active

# Template
gcloud config set project <PROJECT_ID>

# Example
gcloud config set project technova-mcp-server

Step 2: Install Google Cloud CLI

For macOS (using Homebrew)

brew install google-cloud-sdk

For Windows

Download from: https://cloud.google.com/sdk/docs/install

For Linux

curl https://sdk.cloud.google.com | bash
exec -l $SHELL

Step 3: Authenticate with Google Cloud

gcloud auth login

This opens your browser to sign in with your Google account.


Step 4: Build Your Docker Image

Build your Docker image locally

# Template
docker build -t <IMAGE_NAME> .

# Example important we need to specify platform

docker build --platform linux/amd64 -t technova-mcp-server .

Verify your image was built

docker images

Step 5: Enable Required APIs

Enable Artifact Registry API

# Template
gcloud services enable artifactregistry.googleapis.com --project=<PROJECT_ID>

# Example
gcloud services enable artifactregistry.googleapis.com --project=technova-mcp-server

Enable Cloud Run API

# Template
gcloud services enable run.googleapis.com --project=<PROJECT_ID>

# Example
gcloud services enable run.googleapis.com --project=technova-mcp-server

Step 6: Create Artifact Registry Repository

# Template
gcloud artifacts repositories create <REPO_NAME> \
  --repository-format=docker \
  --location=<REGION> \
  --project=<PROJECT_ID>

# Example
gcloud artifacts repositories create technova-repo \
  --repository-format=docker \
  --location=us-central1 \
  --project=technova-mcp-server

Step 7: Configure Docker Authentication

# Template
gcloud auth configure-docker <REGION>-docker.pkg.dev

# Example
gcloud auth configure-docker us-central1-docker.pkg.dev

Step 8: Set Up IAM Permissions

Grant yourself editor permissions

# Template
gcloud projects add-iam-policy-binding <PROJECT_ID> \
  --member="user:<YOUR_EMAIL>" \
  --role="roles/editor"

# Example
gcloud projects add-iam-policy-binding technova-mcp-server \
  --member="user:muellerjohannes93@gmail.com" \
  --role="roles/editor"

Grant Artifact Registry writer permissions

# Template
gcloud projects add-iam-policy-binding <PROJECT_ID> \
  --member="user:<YOUR_EMAIL>" \
  --role="roles/artifactregistry.writer"

# Example
gcloud projects add-iam-policy-binding technova-mcp-server \
  --member="user:muellerjohannes93@gmail.com" \
  --role="roles/artifactregistry.writer"

Step 9: Tag and Push Image to Artifact Registry

Tag your image

# Template
docker tag <LOCAL_IMAGE_NAME> \
  <REGION>-docker.pkg.dev/<PROJECT_ID>/<REPO_NAME>/<IMAGE_NAME>:<TAG>

# Example
docker tag technova-mcp-server \
  us-central1-docker.pkg.dev/technova-mcp-server/technova-repo/technova-mcp-server:latest

Push image to registry

# Template
docker push <REGION>-docker.pkg.dev/<PROJECT_ID>/<REPO_NAME>/<IMAGE_NAME>:<TAG>

# Example
docker push \
  us-central1-docker.pkg.dev/technova-mcp-server/technova-repo/technova-mcp-server:latest

Step 10: Deploy to Cloud Run

Deploy using the pushed image

# Template
gcloud run deploy <SERVICE_NAME> \
  --image <REGION>-docker.pkg.dev/<PROJECT_ID>/<REPO_NAME>/<IMAGE_NAME>:<TAG> \
  --region <REGION> \
  --project <PROJECT_ID> \
  --allow-unauthenticated \
  --memory <MEMORY_SIZE> \
  --platform managed \
  --port <PORT>

# Example
gcloud run deploy technova-mcp-server \
  --image us-central1-docker.pkg.dev/technova-mcp-server/technova-repo/technova-mcp-server:latest \
  --region us-central1 \
  --project technova-mcp-server \
  --allow-unauthenticated \
  --memory 1Gi \
  --platform managed \
  --port 8080

Note: This example uses the consistent project ID technova-mcp-server throughout._ID>
--allow-unauthenticated
--memory <MEMORY_SIZE>
--platform managed
--port

Example

gcloud run deploy technova-mcp-server
--image us-central1-docker.pkg.dev/technova-mcp-server/technova-repo/technova-mcp-server:latest
--region us-central1
--project technova-mcp-server
--allow-unauthenticated
--memory 1Gi
--platform managed
--port 8080


### ⭐ Recommended: Deploy directly from source (Cloud Build handles everything)
```bash
# Template
gcloud run deploy <SERVICE_NAME> \
  --source . \
  --port <PORT> \
  --memory <MEMORY_SIZE> \
  --allow-unauthenticated \
  --region <REGION> \
  --project <PROJECT_ID>

# Working example (from successful deployment)
gcloud run deploy technova-mcp-server \
  --source . \
  --port 8080 \
  --memory 1Gi \
  --allow-unauthenticated \
  --region us-central1 \
  --project technova-mcp-server

Why this method works better:

  • Cloud Run automatically builds your Docker image using Cloud Build
  • No manual Docker registry setup needed
  • Handles dependencies and build process automatically
  • Less prone to port configuration errors

Common Values Reference

Parameter Common Values Description
<REGION> us-central1, us-east1, europe-west1 Geographic location
<MEMORY_SIZE> 512Mi, 1Gi, 2Gi, 4Gi Memory allocation
<PORT> 8080, 3000, 5000 Application port
<TAG> latest, v1.0, dev Image version tag

Verification Steps

Check your deployment

gcloud run services list --project=<PROJECT_ID>

Get service URL

gcloud run services describe <SERVICE_NAME> \
  --region=<REGION> \
  --project=<PROJECT_ID> \
  --format="value(status.url)"

View logs

gcloud logs tail --project=<PROJECT_ID>

Troubleshooting

Common Issues

Authentication Error: Run gcloud auth login again

Permission Denied: Check IAM permissions in Step 8

Image Not Found: Verify image was pushed successfully with gcloud artifacts docker images list --repository=<REPO_NAME> --location=<REGION>

🔥 Container Failed to Start (Port Issues)

Error Message: The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable

Root Cause: Your application isn't listening on the correct port that Cloud Run expects.

Solution Steps:

1. Check your application code Your app must listen on the port specified by the PORT environment variable:

// Node.js/Express example
const port = process.env.PORT || 8080;
app.listen(port, '0.0.0.0', () => {
  console.log(`Server running on port ${port}`);
});
# Python/Flask example
import os
from flask import Flask

app = Flask(__name__)

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    app.run(host='0.0.0.0', port=port)

2. Test locally with PORT environment variable

# Test locally to ensure your app respects PORT env var
PORT=8080 docker run -p 8080:8080 -e PORT=8080 technova-mcp-server

# Test if accessible
curl http://localhost:8080

3. Check your Dockerfile Ensure your Dockerfile doesn't hardcode a different port:

# ❌ Bad - hardcoded port
EXPOSE 3000
CMD ["node", "server.js"]

# ✅ Good - uses environment variable
EXPOSE 8080
CMD ["node", "server.js"]

4. Deploy with increased timeout

gcloud run deploy technova-mcp-server \
  --image us-central1-docker.pkg.dev/technova-mcp-server/technova-repo/technova-mcp-server:latest \
  --region us-central1 \
  --project technova-mcp-server \
  --allow-unauthenticated \
  --memory 1Gi \
  --port 8080 \
  --timeout 300 \
  --cpu 1

5. Check logs for more details

gcloud logs tail --project=technova-mcp-server

Debug Checklist:

  • App listens on process.env.PORT or equivalent
  • App binds to 0.0.0.0, not localhost or 127.0.0.1
  • Dockerfile exposes the correct port
  • No firewall or security groups blocking the port
  • App starts within Cloud Run's timeout (default 240 seconds)

Debugging Your Deployment

Get detailed logs

# Follow logs in real-time
gcloud logs tail --project=technova-mcp-server

# Get specific revision logs
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=technova-mcp-server" --project=technova-mcp-server --limit=50

Test your container locally first

# Build and test locally with same environment as Cloud Run
docker build -t technova-mcp-server .
docker run -p 8080:8080 -e PORT=8080 technova-mcp-server

# In another terminal, test if it responds
curl http://localhost:8080

Check service status

# Get service details
gcloud run services describe technova-mcp-server \
  --region us-central1 \
  --project technova-mcp-server

# List all revisions
gcloud run revisions list \
  --service technova-mcp-server \
  --region us-central1 \
  --project technova-mcp-server

Quick Commands Summary

# Setup
gcloud config set project <PROJECT_ID>
gcloud services enable artifactregistry.googleapis.com run.googleapis.com

# Build & Push
docker build -t <IMAGE_NAME> .
docker tag <IMAGE_NAME> <REGION>-docker.pkg.dev/<PROJECT_ID>/<REPO_NAME>/<IMAGE_NAME>:latest
docker push <REGION>-docker.pkg.dev/<PROJECT_ID>/<REPO_NAME>/<IMAGE_NAME>:latest

# Deploy
gcloud run deploy <SERVICE_NAME> \
  --image <REGION>-docker.pkg.dev/<PROJECT_ID>/<REPO_NAME>/<IMAGE_NAME>:latest \
  --region <REGION> \
  --allow-unauthenticated

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

iflow_mcp_xamhans_mcp_course-0.1.0.tar.gz (8.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

iflow_mcp_xamhans_mcp_course-0.1.0-py3-none-any.whl (8.4 kB view details)

Uploaded Python 3

File details

Details for the file iflow_mcp_xamhans_mcp_course-0.1.0.tar.gz.

File metadata

  • Download URL: iflow_mcp_xamhans_mcp_course-0.1.0.tar.gz
  • Upload date:
  • Size: 8.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for iflow_mcp_xamhans_mcp_course-0.1.0.tar.gz
Algorithm Hash digest
SHA256 fdfae0c8575af0338d34634f8cfc8188bec8a6dbc06c1d85b752620fa0c82788
MD5 3b68ab9d0d747b8382e40be73b1594bc
BLAKE2b-256 ce937edf31439d8bfb3d7f3dcc689de63f1e578a9b6f7425e105b6fed0acd81b

See more details on using hashes here.

File details

Details for the file iflow_mcp_xamhans_mcp_course-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: iflow_mcp_xamhans_mcp_course-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 8.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for iflow_mcp_xamhans_mcp_course-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bd0d8ac3e5ecc548e8d627b29ca6be92331779fc74171a349a7e4de6824515f9
MD5 52e07a1fa64bb12bff051b0c41b9d90d
BLAKE2b-256 4770cc4cc48ca6ec7c8b0b482612f5e58431eda31037d3c4f48b28b9846d9762

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page