{"id":285,"date":"2026-10-14T10:40:52","date_gmt":"2026-10-14T02:40:52","guid":{"rendered":"https:\/\/yykcj.com\/?p=285"},"modified":"2026-10-14T10:40:52","modified_gmt":"2026-10-14T02:40:52","slug":"docker-%e5%a4%9a%e9%98%b6%e6%ae%b5%e6%9e%84%e5%bb%ba%e4%bc%98%e5%8c%96%e5%ae%9e%e6%88%98%ef%bc%9a%e4%bb%8e-1-2gb-%e5%88%b0-80mb-%e7%9a%84%e9%95%9c%e5%83%8f%e7%98%a6%e8%ba%ab%e6%8c%87%e5%8d%97","status":"publish","type":"post","link":"https:\/\/yykcj.com\/?p=285","title":{"rendered":"Docker \u591a\u9636\u6bb5\u6784\u5efa\u4f18\u5316\u5b9e\u6218\uff1a\u4ece 1.2GB \u5230 80MB \u7684\u955c\u50cf\u7626\u8eab\u6307\u5357"},"content":{"rendered":"<h2>\u4e3a\u4ec0\u4e48\u4f60\u7684 Docker \u955c\u50cf\u603b\u662f\u8fd9\u4e48\u5927\uff1f<\/h2>\n<p>\u5f88\u591a\u56e2\u961f\u5728\u5bb9\u5668\u5316\u5e94\u7528\u65f6\uff0c\u5e38\u5e38\u76f4\u63a5\u4f7f\u7528 <code>node:18<\/code> \u8fd9\u6837\u7684\u57fa\u7840\u955c\u50cf\uff0c\u7136\u540e\u628a\u6e90\u4ee3\u7801\u3001\u4f9d\u8d56\u3001\u6784\u5efa\u5de5\u5177\u5168\u90e8\u585e\u8fdb\u53bb\u3002\u7ed3\u679c\u4e00\u4e2a\u7b80\u5355\u7684 Express \u5e94\u7528\u955c\u50cf\u8f7b\u677e\u7a81\u7834 1GB\uff0c\u4e0d\u4ec5\u62d6\u6162 CI\/CD \u901f\u5ea6\uff0c\u8fd8\u589e\u52a0\u4e86\u5b89\u5168\u98ce\u9669\u3002<\/p>\n<p>\u591a\u9636\u6bb5\u6784\u5efa\uff08Multi-stage Build\uff09\u662f Docker 17.05 \u5f15\u5165\u7684\u7279\u6027\uff0c\u5b83\u5141\u8bb8\u4f60\u5728\u4e00\u4e2a Dockerfile \u4e2d\u5b9a\u4e49\u591a\u4e2a\u9636\u6bb5\uff0c\u6bcf\u4e2a\u9636\u6bb5\u53ef\u4ee5\u4f7f\u7528\u4e0d\u540c\u7684\u57fa\u7840\u955c\u50cf\uff0c\u6700\u7ec8\u53ea\u5c06\u5fc5\u8981\u7684\u4ea7\u7269\u590d\u5236\u5230\u6700\u7ec8\u955c\u50cf\u4e2d\u3002\u672c\u6587\u5c06\u901a\u8fc7\u4e00\u4e2a\u771f\u5b9e\u7684\u524d\u540e\u7aef\u9879\u76ee\uff08React + Node.js\uff09\uff0c\u5e26\u4f60\u4e00\u6b65\u6b65\u4f18\u5316\u955c\u50cf\uff0c\u5e76\u5206\u4eab\u6211\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u603b\u7ed3\u7684 5 \u4e2a\u5173\u952e\u6280\u5de7\u3002<\/p>\n<h2>\u9879\u76ee\u80cc\u666f\u4e0e\u521d\u59cb Dockerfile<\/h2>\n<p>\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u5178\u578b\u7684\u5168\u6808\u9879\u76ee\uff1a<\/p>\n<pre><code>\nmy-app\/\n\u251c\u2500\u2500 client\/          # React \u524d\u7aef\uff08Vite \u6784\u5efa\uff09\n\u2502   \u251c\u2500\u2500 src\/\n\u2502   \u251c\u2500\u2500 package.json\n\u2502   \u2514\u2500\u2500 vite.config.js\n\u251c\u2500\u2500 server\/          # Node.js \u540e\u7aef\uff08Express\uff09\n\u2502   \u251c\u2500\u2500 src\/\n\u2502   \u2514\u2500\u2500 package.json\n\u2514\u2500\u2500 docker-compose.yml\n<\/code><\/pre>\n<p>\u6700\u521d\u7684 Dockerfile \u53ef\u80fd\u662f\u8fd9\u6837\u7684\uff08\u5355\u9636\u6bb5\uff09\uff1a<\/p>\n<pre><code class=\"language-dockerfile\">\nFROM node:18\nWORKDIR \/app\nCOPY . .\nRUN npm install\nRUN npm run build\nEXPOSE 3000\nCMD [&quot;node&quot;, &quot;server\/src\/index.js&quot;]\n<\/code><\/pre>\n<p>\u6784\u5efa\u540e\u955c\u50cf\u5927\u5c0f\uff1a<strong>1.2GB<\/strong>\u3002\u95ee\u9898\u5f88\u660e\u663e\uff1a\u5305\u542b\u4e86\u5b8c\u6574\u7684 Node.js \u955c\u50cf\u3001devDependencies\u3001\u6e90\u4ee3\u7801\u3001\u6784\u5efa\u7f13\u5b58\u7b49\u3002<\/p>\n<h2>\u7b2c\u4e00\u6b65\uff1a\u62c6\u5206\u6784\u5efa\u9636\u6bb5\u4e0e\u8fd0\u884c\u9636\u6bb5<\/h2>\n<p>\u591a\u9636\u6bb5\u6784\u5efa\u7684\u6838\u5fc3\u601d\u60f3\u662f\uff1a<strong>\u6784\u5efa\u73af\u5883\u4e0e\u8fd0\u884c\u73af\u5883\u5206\u79bb<\/strong>\u3002\u6211\u4eec\u5b9a\u4e49\u4e24\u4e2a\u9636\u6bb5\uff1a<\/p>\n<ul>\n<li><code>builder<\/code> \u9636\u6bb5\uff1a\u5b89\u88c5\u6240\u6709\u4f9d\u8d56\uff08\u5305\u62ec devDependencies\uff09\uff0c\u6267\u884c\u6784\u5efa<\/li>\n<li><code>runner<\/code> \u9636\u6bb5\uff1a\u4ec5\u590d\u5236\u6784\u5efa\u4ea7\u7269\u548c production \u4f9d\u8d56<\/li>\n<\/ul>\n<p>\u4f18\u5316\u540e\u7684 Dockerfile\uff1a<\/p>\n<pre><code class=\"language-dockerfile\">\n# \u9636\u6bb51\uff1a\u6784\u5efa\nFROM node:18-alpine AS builder\nWORKDIR \/app\n\n# \u5148\u590d\u5236 package.json \u4ee5\u5229\u7528\u7f13\u5b58\nCOPY package*.json .\/\nCOPY client\/package*.json .\/client\/\nCOPY server\/package*.json .\/server\/\n\nRUN npm ci --workspaces --include-workspace-root\n\n# \u590d\u5236\u6e90\u4ee3\u7801\u5e76\u6784\u5efa\nCOPY . .\nRUN npm run build --workspace=client\n\n# \u9636\u6bb52\uff1a\u8fd0\u884c\nFROM node:18-alpine AS runner\nWORKDIR \/app\n\n# \u53ea\u590d\u5236\u751f\u4ea7\u4f9d\u8d56\u548c\u6784\u5efa\u4ea7\u7269\nCOPY --from=builder \/app\/package*.json .\/\nCOPY --from=builder \/app\/server\/package*.json .\/server\/\nRUN npm ci --omit=dev --workspaces --include-workspace-root\n\nCOPY --from=builder \/app\/server\/src .\/server\/src\nCOPY --from=builder \/app\/client\/dist .\/client\/dist\n\nEXPOSE 3000\nCMD [&quot;node&quot;, &quot;server\/src\/index.js&quot;]\n<\/code><\/pre>\n<p>\u6784\u5efa\u540e\u955c\u50cf\u5927\u5c0f\uff1a<strong>\u7ea6 350MB<\/strong>\u3002\u5df2\u7ecf\u5927\u5e45\u51cf\u5c0f\uff0c\u4f46\u8fd8\u6709\u4f18\u5316\u7a7a\u95f4\u3002<\/p>\n<p>> \ud83d\udca1 <strong>\u6ce8\u610f<\/strong>\uff1a<code>npm ci<\/code> \u6bd4 <code>npm install<\/code> \u66f4\u5feb\u4e14\u66f4\u53ef\u9760\uff0c\u5b83\u4f1a\u4e25\u683c\u9075\u5faa <code>package-lock.json<\/code>\u3002\u4f7f\u7528 <code>--workspaces<\/code> \u53ef\u4ee5\u5904\u7406 monorepo \u7ed3\u6784\u3002<\/p>\n<h2>\u7b2c\u4e8c\u6b65\uff1a\u4f7f\u7528\u66f4\u5c0f\u7684\u57fa\u7840\u955c\u50cf\u4e0e\u6e05\u7406\u7f13\u5b58<\/h2>\n<p><code>node:18-alpine<\/code> \u672c\u8eab\u7ea6 170MB\uff0c\u6211\u4eec\u53ef\u4ee5\u8fdb\u4e00\u6b65\u51cf\u5c0f\u3002\u4f46 Alpine \u4f7f\u7528 musl libc\uff0c\u67d0\u4e9b\u539f\u751f\u6a21\u5757\u53ef\u80fd\u4e0d\u517c\u5bb9\u3002\u4e00\u4e2a\u6298\u4e2d\u65b9\u6848\u662f\u4f7f\u7528 <code>node:18-slim<\/code>\uff08\u57fa\u4e8e Debian\uff0c\u7ea6 240MB\uff09\uff0c\u6216\u8005\u7ee7\u7eed\u7528 Alpine \u4f46\u786e\u4fdd\u4f9d\u8d56\u517c\u5bb9\u3002<\/p>\n<p>\u6b64\u5916\uff0c<code>npm ci<\/code> \u4f1a\u4ea7\u751f\u7f13\u5b58\u6587\u4ef6\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6e <code>npm<em>config<\/em>cache<\/code> \u5230\u4e34\u65f6\u76ee\u5f55\u5e76\u6e05\u7406\u6765\u51cf\u5c11\u5c42\u5927\u5c0f\uff1a<\/p>\n<pre><code class=\"language-dockerfile\">\nFROM node:18-alpine AS builder\nWORKDIR \/app\n\n# \u8bbe\u7f6e npm \u7f13\u5b58\u5230 \/tmp\uff0c\u907f\u514d\u6c61\u67d3\u955c\u50cf\u5c42\nENV npm_config_cache=\/tmp\/npm-cache\n\nCOPY package*.json .\/\nCOPY client\/package*.json .\/client\/\nCOPY server\/package*.json .\/server\/\n\nRUN npm ci --workspaces --include-workspace-root\n\nCOPY . .\nRUN npm run build --workspace=client\n\n# \u6e05\u7406\u7f13\u5b58\uff08\u867d\u7136\u591a\u9636\u6bb5\u6784\u5efa\u4e2d\u4e0d\u5fc5\u987b\uff0c\u4f46\u80fd\u51cf\u5c11\u4e2d\u95f4\u5c42\u5927\u5c0f\uff09\nRUN rm -rf \/tmp\/npm-cache\n\nFROM node:18-alpine AS runner\nWORKDIR \/app\nENV NODE_ENV=production\n\nCOPY --from=builder \/app\/package*.json .\/\nCOPY --from=builder \/app\/server\/package*.json .\/server\/\nRUN npm ci --omit=dev --workspaces --include-workspace-root &amp;&amp; \\\n    npm cache clean --force\n\nCOPY --from=builder \/app\/server\/src .\/server\/src\nCOPY --from=builder \/app\/client\/dist .\/client\/dist\n\n# \u4f7f\u7528\u975e root \u7528\u6237\u8fd0\u884c\nUSER node\n\nEXPOSE 3000\nCMD [&quot;node&quot;, &quot;server\/src\/index.js&quot;]\n<\/code><\/pre>\n<p>\u955c\u50cf\u5927\u5c0f\uff1a<strong>\u7ea6 120MB<\/strong>\u3002<\/p>\n<h2>\u7b2c\u4e09\u6b65\uff1a\u4f7f\u7528 distroless \u6216 scratch \u955c\u50cf\uff08\u8fdb\u9636\uff09<\/h2>\n<p>\u5bf9\u4e8e\u8ffd\u6c42\u6781\u81f4\u4f53\u79ef\u7684\u573a\u666f\uff0c\u53ef\u4ee5\u8003\u8651 Google \u7684 distroless \u955c\u50cf\uff0c\u5b83\u53ea\u5305\u542b\u5e94\u7528\u548c\u8fd0\u884c\u65f6\u4f9d\u8d56\uff0c\u6ca1\u6709 shell \u548c\u5305\u7ba1\u7406\u5668\uff0c\u5b89\u5168\u6027\u6781\u9ad8\u3002<\/p>\n<pre><code class=\"language-dockerfile\">\nFROM node:18-alpine AS builder\n# ... \u540c\u4e0a\u6784\u5efa\u6b65\u9aa4 ...\n\nFROM gcr.io\/distroless\/nodejs18-debian11\nWORKDIR \/app\n\nCOPY --from=builder \/app\/package*.json .\/\nCOPY --from=builder \/app\/server\/package*.json .\/server\/\nCOPY --from=builder \/app\/node_modules .\/node_modules\nCOPY --from=builder \/app\/server\/src .\/server\/src\nCOPY --from=builder \/app\/client\/dist .\/client\/dist\n\nEXPOSE 3000\nCMD [&quot;server\/src\/index.js&quot;]\n<\/code><\/pre>\n<p>\u6ce8\u610f\uff1adistroless \u955c\u50cf\u4e2d <code>node<\/code> \u547d\u4ee4\u662f\u5165\u53e3\u70b9\uff0c\u6240\u4ee5 CMD \u76f4\u63a5\u5199\u811a\u672c\u8def\u5f84\u3002\u955c\u50cf\u5927\u5c0f\u53ef\u964d\u81f3 <strong>\u7ea6 80MB<\/strong>\u3002<\/p>\n<p>> \u26a0\ufe0f <strong>\u5751\u70b9<\/strong>\uff1adistroless \u6ca1\u6709 shell\uff0c\u65e0\u6cd5\u8fdb\u5165\u5bb9\u5668\u8c03\u8bd5\u3002\u5efa\u8bae\u4ec5\u5728\u7a33\u5b9a\u73af\u5883\u4f7f\u7528\uff0c\u5e76\u786e\u4fdd\u65e5\u5fd7\u8f93\u51fa\u5230 stdout\u3002<\/p>\n<h2>\u7b2c\u56db\u6b65\uff1a\u4f18\u5316\u6784\u5efa\u7f13\u5b58\u4e0e CI \u52a0\u901f<\/h2>\n<p>\u591a\u9636\u6bb5\u6784\u5efa\u7684\u53e6\u4e00\u4e2a\u4f18\u52bf\u662f\u5145\u5206\u5229\u7528\u7f13\u5b58\u3002\u4ee5\u4e0b\u662f\u51e0\u4e2a\u5173\u952e\u5b9e\u8df5\uff1a<\/p>\n<ol>\n<li><strong>\u4f9d\u8d56\u4e0e\u6e90\u7801\u5206\u79bb<\/strong>\uff1a\u5148\u590d\u5236 <code>package.json<\/code> \u5e76\u5b89\u88c5\u4f9d\u8d56\uff0c\u518d\u590d\u5236\u6e90\u7801\u3002\u8fd9\u6837\u4fee\u6539\u6e90\u7801\u4e0d\u4f1a\u89e6\u53d1\u4f9d\u8d56\u91cd\u88c5\u3002<\/li>\n<li><strong>\u4f7f\u7528 BuildKit<\/strong>\uff1aDocker 18.09+ \u652f\u6301 BuildKit\uff0c\u53ef\u4ee5\u5e76\u884c\u6784\u5efa\u9636\u6bb5\uff0c\u5e76\u652f\u6301 <code>--mount=type=cache<\/code> \u6301\u4e45\u5316\u7f13\u5b58\u3002<\/li>\n<\/ol>\n<p>\u542f\u7528 BuildKit \u5e76\u5229\u7528\u7f13\u5b58\u6302\u8f7d\uff1a<\/p>\n<pre><code class=\"language-dockerfile\">\n# syntax=docker\/dockerfile:1.4\nFROM node:18-alpine AS builder\nWORKDIR \/app\n\nCOPY package*.json .\/\nCOPY client\/package*.json .\/client\/\nCOPY server\/package*.json .\/server\/\n\nRUN --mount=type=cache,target=\/root\/.npm \\\n    npm ci --workspaces --include-workspace-root\n\nCOPY . .\nRUN npm run build --workspace=client\n\n# ... \u8fd0\u884c\u9636\u6bb5\u540c\u4e0a\n<\/code><\/pre>\n<p>\u6784\u5efa\u547d\u4ee4\uff1a<code>DOCKER_BUILDKIT=1 docker build -t my-app .<\/code><\/p>\n<p>\u8fd9\u6837\u5728 CI \u4e2d\uff0cnpm \u7f13\u5b58\u53ef\u4ee5\u8de8\u6784\u5efa\u590d\u7528\uff0c\u5927\u5e45\u51cf\u5c11\u5b89\u88c5\u65f6\u95f4\u3002<\/p>\n<h2>\u7b2c\u4e94\u6b65\uff1a\u5b89\u5168\u4e0e\u4f53\u79ef\u7684\u989d\u5916\u6280\u5de7<\/h2>\n<ul>\n<li><strong>\u5408\u5e76 RUN \u6307\u4ee4<\/strong>\uff1a\u51cf\u5c11\u955c\u50cf\u5c42\u6570\uff0c\u4f46\u53ef\u8bfb\u6027\u4f1a\u4e0b\u964d\uff0c\u9700\u6743\u8861\u3002<\/li>\n<li><strong>\u4f7f\u7528 <code>.dockerignore<\/code><\/strong>\uff1a\u6392\u9664 <code>node_modules<\/code>\u3001<code>.git<\/code>\u3001\u6d4b\u8bd5\u6587\u4ef6\u7b49\uff0c\u907f\u514d\u590d\u5236\u65e0\u7528\u5185\u5bb9\u3002<\/li>\n<li><strong>\u591a\u5e73\u53f0\u6784\u5efa<\/strong>\uff1a\u4f7f\u7528 <code>docker buildx<\/code> \u6784\u5efa arm64\/amd64 \u955c\u50cf\uff0c\u4fbf\u4e8e\u5728 Apple Silicon \u548c\u4e91\u670d\u52a1\u5668\u4e0a\u8fd0\u884c\u3002<\/li>\n<\/ul>\n<p>\u793a\u4f8b <code>.dockerignore<\/code>\uff1a<\/p>\n<pre><code>\n**\/node_modules\n**\/dist\n**\/.git\n**\/*.md\n**\/Dockerfile\n**\/docker-compose.yml\n<\/code><\/pre>\n<h2>\u5b8c\u6574 Dockerfile \u4e0e\u9a8c\u8bc1<\/h2>\n<p>\u6700\u7ec8\u4f18\u5316\u540e\u7684 Dockerfile\uff08\u4f7f\u7528 BuildKit \u548c distroless\uff09\uff1a<\/p>\n<pre><code class=\"language-dockerfile\">\n# syntax=docker\/dockerfile:1.4\n\n# ---- \u6784\u5efa\u9636\u6bb5 ----\nFROM node:18-alpine AS builder\nWORKDIR \/app\n\nCOPY package*.json .\/\nCOPY client\/package*.json .\/client\/\nCOPY server\/package*.json .\/server\/\n\nRUN --mount=type=cache,target=\/root\/.npm \\\n    npm ci --workspaces --include-workspace-root\n\nCOPY . .\nRUN npm run build --workspace=client\n\n# ---- \u8fd0\u884c\u9636\u6bb5 ----\nFROM gcr.io\/distroless\/nodejs18-debian11\nWORKDIR \/app\n\nCOPY --from=builder \/app\/package*.json .\/\nCOPY --from=builder \/app\/server\/package*.json .\/server\/\nCOPY --from=builder \/app\/node_modules .\/node_modules\nCOPY --from=builder \/app\/server\/src .\/server\/src\nCOPY --from=builder \/app\/client\/dist .\/client\/dist\n\nEXPOSE 3000\nCMD [&quot;server\/src\/index.js&quot;]\n<\/code><\/pre>\n<p>\u6784\u5efa\u5e76\u67e5\u770b\u5927\u5c0f\uff1a<\/p>\n<pre><code class=\"language-bash\">\nDOCKER_BUILDKIT=1 docker build -t my-app:optimized .\ndocker images my-app:optimized\n<\/code><\/pre>\n<p>\u8f93\u51fa\u7c7b\u4f3c\uff1a<\/p>\n<pre><code>\nREPOSITORY   TAG         IMAGE ID       SIZE\nmy-app       optimized   abc123def456   82.3MB\n<\/code><\/pre>\n<h2>\u603b\u7ed3<\/h2>\n<p>\u901a\u8fc7\u591a\u9636\u6bb5\u6784\u5efa\uff0c\u6211\u4eec\u6210\u529f\u5c06\u955c\u50cf\u4ece 1.2GB \u538b\u7f29\u5230 80MB \u5de6\u53f3\uff0c\u540c\u65f6\u63d0\u5347\u4e86\u5b89\u5168\u6027\u548c CI \u6548\u7387\u3002\u5173\u952e\u70b9\u56de\u987e\uff1a<\/p>\n<ol>\n<li>\u5206\u79bb\u6784\u5efa\u4e0e\u8fd0\u884c\u9636\u6bb5\uff0c\u53ea\u590d\u5236\u5fc5\u8981\u4ea7\u7269\u3002<\/li>\n<li>\u4f7f\u7528 Alpine \u6216 distroless \u51cf\u5c0f\u57fa\u7840\u955c\u50cf\u4f53\u79ef\u3002<\/li>\n<li>\u5229\u7528 BuildKit \u7f13\u5b58\u6302\u8f7d\u52a0\u901f\u6784\u5efa\u3002<\/li>\n<li>\u9075\u5faa\u6700\u5c0f\u6743\u9650\u539f\u5219\uff0c\u4f7f\u7528\u975e root \u7528\u6237\u3002<\/li>\n<li>\u7f16\u5199 <code>.dockerignore<\/code> \u907f\u514d\u4e0a\u4e0b\u6587\u81a8\u80c0\u3002<\/li>\n<\/ol>\n<p>\u4e0b\u4e00\u6b65\uff0c\u4f60\u53ef\u4ee5\u63a2\u7d22\uff1a<\/p>\n<ul>\n<li>\u4f7f\u7528 <code>docker scout<\/code> \u5206\u6790\u955c\u50cf\u6f0f\u6d1e<\/li>\n<li>\u7ed3\u5408 GitHub Actions \u5b9e\u73b0\u81ea\u52a8\u5316\u6784\u5efa\u4e0e\u63a8\u9001<\/li>\n<li>\u5c1d\u8bd5 <code>kaniko<\/code> \u5728 Kubernetes \u4e2d\u6784\u5efa\u955c\u50cf<\/li>\n<\/ul>\n<p>\u5e0c\u671b\u8fd9\u7bc7\u6559\u7a0b\u80fd\u5e2e\u4f60\u6253\u9020\u66f4\u8f7b\u91cf\u3001\u66f4\u5b89\u5168\u7684\u5bb9\u5668\u955c\u50cf\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6587\u901a\u8fc7\u4e00\u4e2a\u771f\u5b9e\u7684 Node.js + React \u9879\u76ee\uff0c\u8be6\u7ec6\u6f14\u793a\u5982\u4f55\u5229\u7528 Docker \u591a\u9636\u6bb5\u6784\u5efa\u5c06\u955c\u50cf\u4ece 1.2GB \u538b\u7f29\u5230 80MB\u3002\u6db5\u76d6\u6784\u5efa\u7f13\u5b58\u3001\u5b89\u5168\u4f18\u5316\u3001\u8de8\u5e73\u53f0\u7f16\u8bd1\u7b49\u8fdb\u9636\u6280\u5de7\uff0c\u9644\u5e26\u5b8c\u6574\u53ef\u8fd0\u884c\u7684\u4ee3\u7801\u793a\u4f8b\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,4],"tags":[63,60,5,61,62],"class_list":["post-285","post","type-post","status-publish","format-standard","hentry","category-3","category-4","tag-devops","tag-docker","tag-node-js","tag-61","tag-62"],"_links":{"self":[{"href":"https:\/\/yykcj.com\/index.php?rest_route=\/wp\/v2\/posts\/285","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yykcj.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yykcj.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yykcj.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yykcj.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=285"}],"version-history":[{"count":0,"href":"https:\/\/yykcj.com\/index.php?rest_route=\/wp\/v2\/posts\/285\/revisions"}],"wp:attachment":[{"href":"https:\/\/yykcj.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=285"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yykcj.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=285"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yykcj.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=285"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}