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.PORTor equivalent - App binds to
0.0.0.0, notlocalhostor127.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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fdfae0c8575af0338d34634f8cfc8188bec8a6dbc06c1d85b752620fa0c82788
|
|
| MD5 |
3b68ab9d0d747b8382e40be73b1594bc
|
|
| BLAKE2b-256 |
ce937edf31439d8bfb3d7f3dcc689de63f1e578a9b6f7425e105b6fed0acd81b
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd0d8ac3e5ecc548e8d627b29ca6be92331779fc74171a349a7e4de6824515f9
|
|
| MD5 |
52e07a1fa64bb12bff051b0c41b9d90d
|
|
| BLAKE2b-256 |
4770cc4cc48ca6ec7c8b0b482612f5e58431eda31037d3c4f48b28b9846d9762
|