Gap-9: Container Apps Migrate (F → A) — ECS/Fargate + Cloud Run migration guides#1634
Gap-9: Container Apps Migrate (F → A) — ECS/Fargate + Cloud Run migration guides#1634
Conversation
…p-9) Add cross-cloud migration support for Container Apps: - ecs-to-container-apps.md — AWS ECS/Fargate migration - cloud-run-to-container-apps.md — GCP Cloud Run migration - assessment.md — Container-specific assessment template - code-migration.md — Dockerfile optimization, YAML conversion - global-rules.md — Container migration rules Closes #1617 Parent: #1608 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Adds migration reference documentation for moving container workloads from AWS ECS/Fargate and GCP Cloud Run to Azure Container Apps, plus general rules and phased guidance (assessment + code migration).
Changes:
- Added global migration rules for Container Apps, including confirmation and identity-first guidance.
- Added AWS ECS/Fargate → Container Apps and GCP Cloud Run → Container Apps migration guides with mapping tables and example manifests.
- Added assessment and code-migration phase references, including report templates and Dockerfile/YAML patterns.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| plugin/skills/azure-cloud-migrate/references/services/container-apps/global-rules.md | Defines cross-phase rules (confirmation policy, identity-first auth, ACA specifics, output directory). |
| plugin/skills/azure-cloud-migrate/references/services/container-apps/ecs-to-container-apps.md | ECS/Fargate to Container Apps service/resource mapping plus YAML and operational guidance. |
| plugin/skills/azure-cloud-migrate/references/services/container-apps/code-migration.md | Code/config migration phase steps, Dockerfile optimization guidance, and YAML patterns. |
| plugin/skills/azure-cloud-migrate/references/services/container-apps/cloud-run-to-container-apps.md | Cloud Run to Container Apps mapping, YAML examples, jobs mapping, and key differences. |
| plugin/skills/azure-cloud-migrate/references/services/container-apps/assessment.md | Assessment phase checklist and a fixed-format assessment report template. |
| | AWS Service | Azure Equivalent | | ||
| |-------------|------------------| | ||
| | ECS Service | Container App | | ||
| | ECS Task Definition | Container App revision template | |
There was a problem hiding this comment.
Markdown tables here start rows with ||, which renders as an extra empty first column in common Markdown parsers. Replace leading || with a single | on all table rows in this document (and keep column counts consistent) so the mapping tables render correctly.
| | GCP Service | Azure Equivalent | | ||
| |-------------|------------------| | ||
| | Cloud Run Service | Container App | | ||
| | Cloud Run Revision | Container App revision | |
There was a problem hiding this comment.
The mapping tables use || at the start of each row, which creates an unintended blank first column in Markdown. Update these tables to use single leading pipes (| ... | ... |) so they render as 2-column tables.
| | Property | Value | | ||
| |----------|-------| | ||
| | **Total Services** | <count> | |
There was a problem hiding this comment.
Inside the assessment report template, tables also start with ||, which produces an extra blank column. Since this template is marked 'MANDATORY' for users to copy verbatim, it’s important the Markdown renders cleanly—please change table rows to start with a single | throughout the template.
| RUN npm ci --production | ||
| COPY . . | ||
| RUN npm run build | ||
|
|
||
| FROM node:20-alpine | ||
| WORKDIR /app | ||
| COPY --from=builder /app/dist ./dist | ||
| COPY --from=builder /app/node_modules ./node_modules |
There was a problem hiding this comment.
This Dockerfile pattern is likely to break for many Node projects because npm ci --production omits devDependencies that are often required for npm run build (e.g., TypeScript, bundlers). A more reliable pattern is to install full dependencies in the build stage, run the build, then install/retain only production dependencies in the runtime stage (or prune dev deps after build).
| RUN npm ci --production | |
| COPY . . | |
| RUN npm run build | |
| FROM node:20-alpine | |
| WORKDIR /app | |
| COPY --from=builder /app/dist ./dist | |
| COPY --from=builder /app/node_modules ./node_modules | |
| RUN npm ci | |
| COPY . . | |
| RUN npm run build | |
| FROM node:20-alpine | |
| WORKDIR /app | |
| COPY package*.json ./ | |
| RUN npm ci --only=production | |
| COPY --from=builder /app/dist ./dist |
| name: my-api | ||
| resources: | ||
| cpu: 1.0 | ||
| memory: 512Mi |
There was a problem hiding this comment.
The Container Apps manifest examples elsewhere in this PR use Gi units (e.g., 1Gi, 0.5Gi). 512Mi may not be accepted by the Container Apps ARM/YAML schema depending on tooling/validation path. To avoid copy/paste failures, consider using 0.5Gi (or 1Gi) consistently for resources.memory in Container Apps examples.
| memory: 512Mi | |
| memory: 0.5Gi |
|
|
||
| - Always use `mcp_azure_mcp_get_bestpractices` tool before generating Azure code | ||
| - Prefer managed identity over connection strings or API keys | ||
| - **Always use the latest stable base images** — check official images for newest GA tags |
There was a problem hiding this comment.
This conflicts with the later guidance in code-migration.md recommending fixed/pinned base image tags and avoiding latest. To make the guidance consistent and actionable, rephrase to something like: choose the latest stable version and pin it to an explicit tag/digest (avoid floating tags like latest).
| - **Always use the latest stable base images** — check official images for newest GA tags | |
| - **Choose the latest stable base image and pin it to an explicit version tag or digest (avoid floating tags like `latest`)** — check official images for newest GA tags |
| # Import from ECR (with credentials) | ||
| az acr import --name <acr-name> \ | ||
| --source <account>.dkr.ecr.<region>.amazonaws.com/<image>:<tag> \ | ||
| --username AWS --password $(aws ecr get-login-password) |
There was a problem hiding this comment.
The ECR get-login-password call omits --region, while the ECS guide includes it. Since ECR credentials are region-scoped, this can fail or authenticate against an unintended default region. Prefer including --region <region> (or explicitly calling out that AWS_DEFAULT_REGION must be set) to make the command deterministic.
| --username AWS --password $(aws ecr get-login-password) | |
| --username AWS --password $(aws ecr get-login-password --region <region>) |
Details# 🔍 Token Analysis Report
fatal: path 'plugin/skills/azure-cloud-migrate/references/services/container-apps/assessment.md' exists on disk, but not in 'origin/main' 📊 Token Change ReportComparing Summary
Changed Files
📊 Token Limit Check ReportChecked: 529 files
|
| File | Tokens | Limit | Over By |
|---|---|---|---|
.github/skills/analyze-test-run/SKILL.md |
2471 | 500 | +1971 |
.github/skills/file-test-bug/SKILL.md |
628 | 500 | +128 |
.github/skills/sensei/README.md |
3531 | 2000 | +1531 |
.github/skills/sensei/SKILL.md |
2382 | 500 | +1882 |
.github/skills/sensei/references/EXAMPLES.md |
3707 | 2000 | +1707 |
.github/skills/sensei/references/LOOP.md |
4181 | 2000 | +2181 |
.github/skills/sensei/references/SCORING.md |
3927 | 2000 | +1927 |
.github/skills/skill-authoring/SKILL.md |
817 | 500 | +317 |
plugin/skills/appinsights-instrumentation/SKILL.md |
908 | 500 | +408 |
plugin/skills/azure-ai/SKILL.md |
817 | 500 | +317 |
plugin/skills/azure-aigateway/SKILL.md |
1258 | 500 | +758 |
plugin/skills/azure-aigateway/references/policies.md |
2342 | 2000 | +342 |
plugin/skills/azure-cloud-migrate/references/services/container-apps/cloud-run-to-container-apps.md |
2080 | 2000 | +80 |
plugin/skills/azure-cloud-migrate/references/services/functions/lambda-to-functions.md |
2600 | 2000 | +600 |
plugin/skills/azure-cloud-migrate/references/services/functions/runtimes/javascript.md |
2181 | 2000 | +181 |
plugin/skills/azure-compliance/SKILL.md |
1185 | 500 | +685 |
plugin/skills/azure-compute/SKILL.md |
755 | 500 | +255 |
plugin/skills/azure-compute/workflows/vm-recommender/vm-recommender.md |
2393 | 2000 | +393 |
plugin/skills/azure-compute/workflows/vm-troubleshooter/references/cannot-connect-to-vm.md |
7308 | 2000 | +5308 |
plugin/skills/azure-cost-optimization/SKILL.md |
3900 | 500 | +3400 |
plugin/skills/azure-deploy/SKILL.md |
1562 | 500 | +1062 |
plugin/skills/azure-diagnostics/SKILL.md |
1132 | 500 | +632 |
plugin/skills/azure-diagnostics/aks-troubleshooting/networking.md |
2147 | 2000 | +147 |
plugin/skills/azure-diagnostics/aks-troubleshooting/node-issues.md |
2003 | 2000 | +3 |
plugin/skills/azure-enterprise-infra-planner/SKILL.md |
991 | 500 | +491 |
plugin/skills/azure-enterprise-infra-planner/references/constraints/compute-apps.md |
2022 | 2000 | +22 |
plugin/skills/azure-hosted-copilot-sdk/SKILL.md |
608 | 500 | +108 |
plugin/skills/azure-kubernetes/SKILL.md |
2266 | 500 | +1766 |
plugin/skills/azure-kusto/SKILL.md |
2149 | 500 | +1649 |
plugin/skills/azure-messaging/SKILL.md |
967 | 500 | +467 |
plugin/skills/azure-prepare/SKILL.md |
2607 | 500 | +2107 |
plugin/skills/azure-prepare/references/aspire.md |
2991 | 2000 | +991 |
plugin/skills/azure-prepare/references/plan-template.md |
2559 | 2000 | +559 |
plugin/skills/azure-prepare/references/recipes/azd/terraform.md |
3012 | 2000 | +1012 |
plugin/skills/azure-prepare/references/resources-limits-quotas.md |
3322 | 2000 | +1322 |
plugin/skills/azure-prepare/references/security.md |
2092 | 2000 | +92 |
plugin/skills/azure-prepare/references/services/functions/bicep.md |
3065 | 2000 | +1065 |
plugin/skills/azure-prepare/references/services/functions/templates/SPEC-composable-templates.md |
6187 | 2000 | +4187 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/composition.md |
4649 | 2000 | +2649 |
plugin/skills/azure-prepare/references/services/functions/terraform.md |
3358 | 2000 | +1358 |
plugin/skills/azure-quotas/SKILL.md |
3445 | 500 | +2945 |
plugin/skills/azure-quotas/references/commands.md |
2644 | 2000 | +644 |
plugin/skills/azure-resource-lookup/SKILL.md |
1279 | 500 | +779 |
plugin/skills/azure-resource-visualizer/SKILL.md |
2054 | 500 | +1554 |
plugin/skills/azure-storage/SKILL.md |
1180 | 500 | +680 |
plugin/skills/azure-upgrade/SKILL.md |
1001 | 500 | +501 |
plugin/skills/azure-upgrade/references/services/functions/automation.md |
3463 | 2000 | +1463 |
plugin/skills/azure-upgrade/references/services/functions/consumption-to-flex.md |
2773 | 2000 | +773 |
plugin/skills/azure-validate/SKILL.md |
906 | 500 | +406 |
plugin/skills/entra-app-registration/SKILL.md |
2068 | 500 | +1568 |
plugin/skills/entra-app-registration/references/api-permissions.md |
2545 | 2000 | +545 |
plugin/skills/entra-app-registration/references/cli-commands.md |
2211 | 2000 | +211 |
plugin/skills/entra-app-registration/references/console-app-example.md |
2752 | 2000 | +752 |
plugin/skills/entra-app-registration/references/oauth-flows.md |
2375 | 2000 | +375 |
plugin/skills/microsoft-foundry/SKILL.md |
2870 | 500 | +2370 |
plugin/skills/microsoft-foundry/foundry-agent/create/create.md |
3016 | 2000 | +1016 |
plugin/skills/microsoft-foundry/foundry-agent/deploy/deploy.md |
5511 | 2000 | +3511 |
plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/eval-datasets.md |
2342 | 2000 | +342 |
plugin/skills/microsoft-foundry/foundry-agent/eval-datasets/references/trace-to-dataset.md |
4268 | 2000 | +2268 |
plugin/skills/microsoft-foundry/foundry-agent/observe/observe.md |
2547 | 2000 | +547 |
plugin/skills/microsoft-foundry/foundry-agent/trace/references/kql-templates.md |
2701 | 2000 | +701 |
plugin/skills/microsoft-foundry/models/deploy-model/SKILL.md |
1640 | 500 | +1140 |
plugin/skills/microsoft-foundry/models/deploy-model/capacity/SKILL.md |
1739 | 500 | +1239 |
plugin/skills/microsoft-foundry/models/deploy-model/customize/SKILL.md |
2235 | 500 | +1735 |
plugin/skills/microsoft-foundry/models/deploy-model/customize/references/customize-workflow.md |
3335 | 2000 | +1335 |
plugin/skills/microsoft-foundry/models/deploy-model/preset/SKILL.md |
1226 | 500 | +726 |
plugin/skills/microsoft-foundry/models/deploy-model/preset/references/preset-workflow.md |
5534 | 2000 | +3534 |
plugin/skills/microsoft-foundry/quota/quota.md |
2129 | 2000 | +129 |
plugin/skills/microsoft-foundry/quota/references/capacity-planning.md |
2029 | 2000 | +29 |
plugin/skills/microsoft-foundry/references/sdk/foundry-sdk-py.md |
2162 | 2000 | +162 |
Consider moving content to
references/subdirectories.
Automated token analysis. See skill authoring guidelines for best practices.
|
Hi — from the ACA team's perspective, we'd recommend preferring PRs #1534 (AWS Fargate → ACA) and #1567 (GCP Cloud Run → ACA) over the migration content in this PR once the outstanding review issues on those PRs are addressed. Those PRs provide standalone, independently testable migration skills with full end-to-end playbooks (assessment → image migration → deployment → validation), bash + PowerShell parity, error handling, and tests — whereas the reference additions here are more supplementary mapping tables without actionable deployment workflows. We're actively working on fixing the review feedback on #1534 and #1567 and will update those PRs accordingly. The non-migration Gap PRs (#1636, #1637, #1642) from this split are being assessed independently. cc @simonjj |
Closes #1617 | Parent: #1608 |⚠️ Depends on #1633 (Gap-8) for SKILL.md trigger changes
5 migration reference files for Container Apps. Adds ECS/Fargate→Container Apps and Cloud Run→Container Apps guides with service mapping tables, assessment templates, and code migration guidance.