[{"data":1,"prerenderedAt":239},["ShallowReactive",2],{"content:\u002Fposts\u002F2025\u002Ffrom-local-to-production-deploy-nuxt-with-docker":3,"surround:\u002Fposts\u002F2025\u002Ffrom-local-to-production-deploy-nuxt-with-docker":228},{"id":4,"title":5,"body":6,"canonical":201,"categories":202,"date":204,"description":205,"draft":206,"extension":207,"image":201,"meta":208,"navigation":209,"path":210,"permalink":201,"readingTime":211,"recommend":201,"references":216,"seo":222,"sitemap":223,"stem":224,"tags":225,"type":201,"updated":204,"__hash__":227},"content\u002Fposts\u002F2025\u002Ffrom-local-to-production-deploy-nuxt-with-docker.md","从本地到生产：使用 Docker 部署 Nuxt",{"type":7,"value":8,"toc":194},"minimark",[9,14,22,32,68,72,81,97,100,109,113,116,126,133,158,161,170],[10,11,13],"h2",{"id":12},"dockerfile","Dockerfile",[15,16,17,18,21],"p",{},"我们的 ",[19,20,13],"code",{"code":13}," 使用多阶段构建过程来创建优化的镜像。",[23,24,30],"pre",{"className":25,"code":27,"filename":13,"language":28,"meta":29},[26],"language-docker","FROM node:22.13.0-alpine AS build\n\nWORKDIR \u002Fapp\nCOPY pnpm-lock.yaml package.json .\u002F\n\n# Enable corepack for pnpm support\nRUN corepack enable\nRUN pnpm install --frozen-lockfile --prod\n\nCOPY . .\nRUN pnpm run build\n\nFROM node:22.13.0-alpine AS final\nWORKDIR \u002Fapp\nCOPY --from=build \u002Fapp\u002F.output .output\nEXPOSE 3000\nCMD [\"node\", \".output\u002Fserver\u002Findex.mjs\"]\n","docker","",[19,31,27],{"__ignoreMap":29},[33,34,35],"alert",{},[36,37,38,46,52,55,61],"ul",{},[39,40,41,42,45],"li",{},"使用 ",[19,43,44],{"code":44},"alpine"," 可以使用最小镜像，可以大幅减少构建后镜像的大小",[39,47,48,51],{},[19,49,50],{"code":50},"corepack enable"," 跨环境一致的管理 pnpm 版本",[39,53,54],{},"多阶段构建可以把最终镜像减少 90%",[39,56,57,60],{},[19,58,59],{"code":59},"--from=build"," 确保依赖版本完全匹配",[39,62,63,64,67],{},"仅复制 ",[19,65,66],{"code":66},".output"," 目录可以防止源代码包含在镜像中",[10,69,71],{"id":70},"docker-compose-配置","Docker compose 配置",[23,73,79],{"className":74,"code":76,"filename":77,"language":78,"meta":29},[75],"language-yaml","services:\n  nuxt-app:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    container_name: nuxt-app\n    restart: always\n    ports:\n      - '3000:3000'\n    healthcheck:\n      test: [CMD, curl, -f, 'http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fhello']\n      interval: 30s\n      timeout: 10s\n    deploy:\n      resources:\n        limits:\n          memory: 1G\n","docker-compose.yml","yaml",[19,80,76],{"__ignoreMap":29},[33,82,83],{},[36,84,85,88,91,94],{},[39,86,87],{},"restart：始终确保应用在崩溃后重启",[39,89,90],{},"healthcheck：这项配置会验证程序是否真正运行",[39,92,93],{},"resources：防止容器内存泄露",[39,95,96],{},"ports：端口映射允许外部直接访问",[15,98,99],{},"健康检查可确保您的应用程序正确响应。如果要添加自定义运行状况端点，请在 Nuxt 应用程序中创建 API 路由：",[23,101,107],{"className":102,"code":104,"filename":105,"language":106,"meta":29},[103],"language-ts","export default defineEventHandler(() => {\n    return \"It's working now!!\"\n})\n","server\u002Fapi\u002Fhealth-check.ts","ts",[19,108,104],{"__ignoreMap":29},[10,110,112],{"id":111},"使用-github-actions-自动构建","使用 GitHub Actions 自动构建",[15,114,115],{},"这个 GitHub Action 会在创建标签或者手动出发时构建和推送镜像",[15,117,118,119],{},"这段代码来自 ",[120,121,125],"a",{"href":122,"rel":123},"https:\u002F\u002Fwww.hrcd.fr\u002Fwriting\u002Ffrom-local-to-production-containerizing-your-nuxt-app",[124],"nofollow","From Local to Production: Deploy the Latest Nuxt Stack with Docker",[23,127,131],{"className":128,"code":129,"filename":130,"language":78,"meta":29},[75],"name: Build and Push Portfolio Docker Image\n\non:\n  push:\n    tags:\n      - 'v*'\n  workflow_dispatch:\n    inputs:\n      tag:\n        description: 'Version tag (ex: v1.0.0)'\n        required: true\n        type: string\n\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:\n  build-and-push:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      packages: write\n\n    steps:\n      - name: Checkout repository\n        uses: actions\u002Fcheckout@v4\n\n      - name: Set up Docker Buildx\n        uses: docker\u002Fsetup-buildx-action@v3\n\n      - name: Log in to GitHub Container Registry\n        uses: docker\u002Flogin-action@v3\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Extract metadata for Docker\n        id: meta\n        uses: docker\u002Fmetadata-action@v5\n        with:\n          images: ${{ env.REGISTRY }}\u002F${{ env.IMAGE_NAME }}\n          tags: |\n            type=ref,event=tag\n            type=raw,value=${{ inputs.tag }},enable=${{ github.event_name == 'workflow_dispatch' }}\n            type=raw,value=latest,enable={{is_default_branch}}\n\n      - name: Build and push Docker image\n        uses: docker\u002Fbuild-push-action@v6\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n",".github\u002Fworkflows\u002Fbuild-and-push.yml",[19,132,129],{"__ignoreMap":29},[33,134,135,141],{},[136,137,138],"template",{"v-slot:title":29},[15,139,140],{},"特性说明",[36,142,143,146,149,152,155],{},[39,144,145],{},"在 git tag （v1.0.0|v1.2.0|v2.0.0）上触发",[39,147,148],{},"支持带有自定义版本标签的手动触发器",[39,150,151],{},"使用 GitHub 的缓存来加速构建",[39,153,154],{},"自动使用版本和最新标签来标记镜像",[39,156,157],{},"使用代码仓库的名称作为镜像名称",[15,159,160],{},"如果需要使用此设置：",[162,163,164,167],"ol",{},[39,165,166],{},"在 GitHub 仓库中发布带有版本标签的新版本或者推送新标签",[39,168,169],{},"从 GitHub 的操作选项卡中手动出发工作流程",[33,171,172,177],{},[136,173,174],{"v-slot:title":29},[15,175,176],{},"正确使用原则",[36,178,179,182,185,188,191],{},[39,180,181],{},"在生产中之后总使用特定的版本标签",[39,183,184],{},"设置健康检查的监控",[39,186,187],{},"配置正确的日志记录",[39,189,190],{},"使用环境变量进行配置",[39,192,193],{},"设置 SSL\u002FTLS",{"title":29,"searchDepth":195,"depth":195,"links":196},4,[197,199,200],{"id":12,"depth":198,"text":13},2,{"id":70,"depth":198,"text":71},{"id":111,"depth":198,"text":112},null,[203],"代码","2025-01-15 14:16:16","使用 Docker 构建 Nuxt 项目",false,"md",{},true,"\u002Fposts\u002F2025\u002Ffrom-local-to-production-deploy-nuxt-with-docker",{"text":212,"minutes":213,"time":214,"words":215},"4 min read",3.175,190500,635,[217,220],{"title":218,"link":219},"Docker","https:\u002F\u002Fwww.docker.com\u002F",{"title":221,"link":122},"From Local to Production Deploy the Latest Nuxt Stack with Docker",{"title":5,"description":205},{"loc":210},"posts\u002F2025\u002Ffrom-local-to-production-deploy-nuxt-with-docker",[226],"Nuxt","AtEbhdGUPH8PnF9KHTRovP59OAhOYMkvgiCrBoxEQyg",[229,234],{"title":230,"path":231,"stem":232,"date":233,"type":201,"children":-1},"【翻译】在 Vue 中构建递归组件","\u002Fposts\u002F2025\u002Fbuilding-recursive-components-in-vue","posts\u002F2025\u002FBuilding-Recursive-components-in-Vue","2025-01-14 13:46:17",{"title":235,"path":236,"stem":237,"date":238,"type":201,"children":-1},"使用 zod 对.env 文件约束","\u002Fposts\u002F2025\u002Fsecurely-share-environment-variables","posts\u002F2025\u002Fsecurely-share-environment-variables","2025-01-15 14:52:04",1789642590790]