[{"data":1,"prerenderedAt":983},["ShallowReactive",2],{"blog-ja-docker-multi-stage-build-optimization":3,"blog-ja-docker-multi-stage-build-optimization-alt":112},{"id":4,"title":5,"author":6,"body":7,"date":967,"description":968,"extension":969,"image":60,"locale":970,"meta":971,"navigation":112,"path":972,"seo":973,"stem":974,"tags":975,"__hash__":982},"blog\u002Fblog\u002Fja\u002Fdocker-multi-stage-build-optimization.md","Docker マルチステージビルドで本番イメージを最適化する","Kubo Team",{"type":8,"value":9,"toc":955},"minimark",[10,19,29,33,51,54,138,159,162,165,265,273,288,296,299,306,349,356,402,405,448,451,456,544,548,604,608,650,663,667,676,841,850,855,910,914,929,932,942,951],[11,12,13,14,18],"p",{},"コンテナ化されたアプリケーションの本番運用では、イメージサイズがデプロイ速度・ストレージコスト・セキュリティに直結します。1GB を超える本番イメージを 10MB 台に圧縮できる ",[15,16,17],"strong",{},"Docker マルチステージビルド","は、もはや選択肢ではなく必須のテクニックです。",[11,20,21,28],{},[22,23,27],"a",{"href":24,"rel":25},"https:\u002F\u002Fkubo.hexabase.io\u002F",[26],"nofollow","Kubo"," では、コンテナワークロードの本番基盤として Kubernetes クラスタを提供しており、イメージの軽量化はクラスタリソースの効率化に直接貢献します。本記事では、マルチステージビルドの基礎から実践的な最適化パターンまでを網羅的に解説します。",[30,31,32],"h2",{"id":32},"マルチステージビルドの基本原理",[11,34,35,36,40,41,44,45,50],{},"マルチステージビルドとは、1つの Dockerfile 内に複数の ",[37,38,39],"code",{},"FROM"," 命令を記述し、",[15,42,43],{},"ビルド環境と実行環境を完全に分離","する手法です。",[22,46,49],{"href":47,"rel":48},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fbest-practices\u002F",[26],"Docker 公式ドキュメント","では「ビルドと最終出力のクリーンな分離を実現する」と説明されています。",[11,52,53],{},"従来の単一ステージビルドでは、コンパイラ・ビルドツール・開発用ライブラリがすべて最終イメージに含まれていました。マルチステージビルドでは、ビルド成果物だけを最終ステージにコピーするため、不要なファイルが本番イメージに混入しません。",[55,56,61],"pre",{"className":57,"code":58,"language":59,"meta":60,"style":60},"language-dockerfile shiki shiki-themes tokyo-night","# ステージ1: ビルド環境\nFROM golang:1.22 AS builder\nWORKDIR \u002Fapp\nCOPY go.mod go.sum .\u002F\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -o \u002Fapp\u002Fserver\n\n# ステージ2: 本番環境（最小イメージ）\nFROM gcr.io\u002Fdistroless\u002Fstatic-debian12\nCOPY --from=builder \u002Fapp\u002Fserver \u002Fserver\nENTRYPOINT [\"\u002Fserver\"]\n","dockerfile","",[37,62,63,71,77,83,89,95,101,107,114,120,126,132],{"__ignoreMap":60},[64,65,68],"span",{"class":66,"line":67},"line",1,[64,69,70],{},"# ステージ1: ビルド環境\n",[64,72,74],{"class":66,"line":73},2,[64,75,76],{},"FROM golang:1.22 AS builder\n",[64,78,80],{"class":66,"line":79},3,[64,81,82],{},"WORKDIR \u002Fapp\n",[64,84,86],{"class":66,"line":85},4,[64,87,88],{},"COPY go.mod go.sum .\u002F\n",[64,90,92],{"class":66,"line":91},5,[64,93,94],{},"RUN go mod download\n",[64,96,98],{"class":66,"line":97},6,[64,99,100],{},"COPY . .\n",[64,102,104],{"class":66,"line":103},7,[64,105,106],{},"RUN CGO_ENABLED=0 GOOS=linux go build -o \u002Fapp\u002Fserver\n",[64,108,110],{"class":66,"line":109},8,[64,111,113],{"emptyLinePlaceholder":112},true,"\n",[64,115,117],{"class":66,"line":116},9,[64,118,119],{},"# ステージ2: 本番環境（最小イメージ）\n",[64,121,123],{"class":66,"line":122},10,[64,124,125],{},"FROM gcr.io\u002Fdistroless\u002Fstatic-debian12\n",[64,127,129],{"class":66,"line":128},11,[64,130,131],{},"COPY --from=builder \u002Fapp\u002Fserver \u002Fserver\n",[64,133,135],{"class":66,"line":134},12,[64,136,137],{},"ENTRYPOINT [\"\u002Fserver\"]\n",[11,139,140,141,144,145,148,149,154,155,158],{},"この例では、ビルドステージの ",[37,142,143],{},"golang:1.22","（約 800MB）から最終的に ",[37,146,147],{},"distroless","（約 2MB）+ バイナリのみの軽量イメージが生成されます。",[22,150,153],{"href":151,"rel":152},"https:\u002F\u002Fopencontainers.org\u002F",[26],"Open Container Initiative の 2026 年レポート","によると、マルチステージビルドで構築されたイメージは従来比で ",[15,156,157],{},"40% の脆弱性削減","を達成しています。",[30,160,161],{"id":161},"ベースイメージの選択戦略",[11,163,164],{},"最終ステージのベースイメージ選択は、イメージサイズとセキュリティに最も大きく影響します。主な選択肢を比較しましょう。",[166,167,168,190],"table",{},[169,170,171],"thead",{},[172,173,174,178,181,184,187],"tr",{},[175,176,177],"th",{},"ベースイメージ",[175,179,180],{},"サイズ",[175,182,183],{},"シェル",[175,185,186],{},"パッケージマネージャ",[175,188,189],{},"推奨用途",[191,192,193,213,231,248],"tbody",{},[172,194,195,201,204,207,210],{},[196,197,198],"td",{},[37,199,200],{},"ubuntu:24.04",[196,202,203],{},"~77MB",[196,205,206],{},"あり",[196,208,209],{},"apt",[196,211,212],{},"開発・デバッグ",[172,214,215,220,223,225,228],{},[196,216,217],{},[37,218,219],{},"alpine:3.21",[196,221,222],{},"~5MB",[196,224,206],{},[196,226,227],{},"apk",[196,229,230],{},"軽量かつデバッグ可能",[172,232,233,237,240,243,245],{},[196,234,235],{},[37,236,147],{},[196,238,239],{},"~2-20MB",[196,241,242],{},"なし",[196,244,242],{},[196,246,247],{},"Java\u002FPython\u002FNode 本番",[172,249,250,255,258,260,262],{},[196,251,252],{},[37,253,254],{},"scratch",[196,256,257],{},"0MB",[196,259,242],{},[196,261,242],{},[196,263,264],{},"Go\u002FRust 静的バイナリ",[11,266,267,272],{},[22,268,271],{"href":269,"rel":270},"https:\u002F\u002Fgithub.com\u002FGoogleContainerTools\u002Fdistroless",[26],"Google の distroless プロジェクト","は、アプリケーションとそのランタイム依存のみを含むイメージです。シェルやパッケージマネージャが存在しないため、攻撃対象領域が大幅に削減されます。",[11,274,275,276,278,279,281,282,287],{},"Go や Rust のように静的バイナリを生成できる言語では ",[37,277,254],{}," が最適ですが、Java・Python・Node.js のように動的ライブラリが必要な言語では ",[37,280,147],{}," が現実的な選択です。",[22,283,286],{"href":284,"rel":285},"https:\u002F\u002Fmedium.com\u002Fgoogle-cloud\u002Falpine-distroless-or-scratch-caac35250e0b",[26],"Alpine と Distroless の比較記事","も参考になります。",[11,289,290,295],{},[22,291,294],{"href":292,"rel":293},"https:\u002F\u002Fwww.hexabase.com\u002Fproduct\u002Fcaptain-ai\u002F",[26],"Captain.AI"," を活用すれば、プロジェクトに最適なベースイメージを AI が自動推薦し、Dockerfile の最適化を支援します。",[30,297,298],{"id":298},"レイヤーキャッシュを最大限活用する",[11,300,301,302,305],{},"Docker は各命令をレイヤーとしてキャッシュします。",[15,303,304],{},"変更頻度の低い命令を先に、高い命令を後に","配置することで、リビルド時間を劇的に短縮できます。",[55,307,309],{"className":57,"code":308,"language":59,"meta":60,"style":60},"# 悪い例: ソースコード変更のたびに依存も再インストール\nCOPY . \u002Fapp\nRUN npm install\n\n# 良い例: 依存定義のみ先にコピーしてキャッシュ活用\nCOPY package.json package-lock.json \u002Fapp\u002F\nRUN npm install\nCOPY . \u002Fapp\u002F\n",[37,310,311,316,321,326,330,335,340,344],{"__ignoreMap":60},[64,312,313],{"class":66,"line":67},[64,314,315],{},"# 悪い例: ソースコード変更のたびに依存も再インストール\n",[64,317,318],{"class":66,"line":73},[64,319,320],{},"COPY . \u002Fapp\n",[64,322,323],{"class":66,"line":79},[64,324,325],{},"RUN npm install\n",[64,327,328],{"class":66,"line":85},[64,329,113],{"emptyLinePlaceholder":112},[64,331,332],{"class":66,"line":91},[64,333,334],{},"# 良い例: 依存定義のみ先にコピーしてキャッシュ活用\n",[64,336,337],{"class":66,"line":97},[64,338,339],{},"COPY package.json package-lock.json \u002Fapp\u002F\n",[64,341,342],{"class":66,"line":103},[64,343,325],{},[64,345,346],{"class":66,"line":109},[64,347,348],{},"COPY . \u002Fapp\u002F\n",[11,350,351,355],{},[22,352,354],{"href":47,"rel":353},[26],"Docker 公式のベストプラクティス","では、以下のキャッシュ戦略が推奨されています。",[357,358,359,377,387,396],"ul",{},[360,361,362,376],"li",{},[15,363,364,367,368,371,372,375],{},[37,365,366],{},"apt-get update"," と ",[37,369,370],{},"apt-get install"," は同一 ",[37,373,374],{},"RUN"," で実行","する。分離するとキャッシュにより古いパッケージリストが使われる",[360,378,379,382,383,386],{},[15,380,381],{},"バージョンピニング","で再現性を確保する（例: ",[37,384,385],{},"alpine:3.21@sha256:...","）",[360,388,389,395],{},[15,390,391,394],{},[37,392,393],{},"--pull"," フラグ","でベースイメージの最新版を取得する",[360,397,398,401],{},[15,399,400],{},"BuildKit の並列ビルド","を活用する。独立したステージは自動的に並列実行される",[11,403,404],{},"BuildKit は Dockerfile を依存関係グラフとして解析し、依存関係のないステージやステップを自動的に並列実行します。これにより、エンドツーエンドのビルド時間が大幅に短縮されます。",[55,406,410],{"className":407,"code":408,"language":409,"meta":60,"style":60},"language-bash shiki shiki-themes tokyo-night","# BuildKit を有効化してビルド\nDOCKER_BUILDKIT=1 docker build -t myapp:latest .\n","bash",[37,411,412,418],{"__ignoreMap":60},[64,413,414],{"class":66,"line":67},[64,415,417],{"class":416},"sbD-w","# BuildKit を有効化してビルド\n",[64,419,420,424,428,432,435,438,442,445],{"class":66,"line":73},[64,421,423],{"class":422},"sE3pS","DOCKER_BUILDKIT",[64,425,427],{"class":426},"sAklC","=",[64,429,431],{"class":430},"sPY7s","1",[64,433,434],{"class":422}," docker",[64,436,437],{"class":430}," build",[64,439,441],{"class":440},"sT800"," -t",[64,443,444],{"class":430}," myapp:latest",[64,446,447],{"class":430}," .\n",[30,449,450],{"id":450},"言語別マルチステージビルドパターン",[452,453,455],"h3",{"id":454},"nodejs-アプリケーション","Node.js アプリケーション",[55,457,459],{"className":57,"code":458,"language":59,"meta":60,"style":60},"FROM node:20-alpine AS deps\nWORKDIR \u002Fapp\nCOPY package.json package-lock.json .\u002F\nRUN npm ci --only=production\n\nFROM node:20-alpine AS builder\nWORKDIR \u002Fapp\nCOPY package.json package-lock.json .\u002F\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM gcr.io\u002Fdistroless\u002Fnodejs20-debian12\nWORKDIR \u002Fapp\nCOPY --from=deps \u002Fapp\u002Fnode_modules .\u002Fnode_modules\nCOPY --from=builder \u002Fapp\u002Fdist .\u002Fdist\nCMD [\"dist\u002Findex.js\"]\n",[37,460,461,466,470,475,480,484,489,493,497,502,506,511,515,521,526,532,538],{"__ignoreMap":60},[64,462,463],{"class":66,"line":67},[64,464,465],{},"FROM node:20-alpine AS deps\n",[64,467,468],{"class":66,"line":73},[64,469,82],{},[64,471,472],{"class":66,"line":79},[64,473,474],{},"COPY package.json package-lock.json .\u002F\n",[64,476,477],{"class":66,"line":85},[64,478,479],{},"RUN npm ci --only=production\n",[64,481,482],{"class":66,"line":91},[64,483,113],{"emptyLinePlaceholder":112},[64,485,486],{"class":66,"line":97},[64,487,488],{},"FROM node:20-alpine AS builder\n",[64,490,491],{"class":66,"line":103},[64,492,82],{},[64,494,495],{"class":66,"line":109},[64,496,474],{},[64,498,499],{"class":66,"line":116},[64,500,501],{},"RUN npm ci\n",[64,503,504],{"class":66,"line":122},[64,505,100],{},[64,507,508],{"class":66,"line":128},[64,509,510],{},"RUN npm run build\n",[64,512,513],{"class":66,"line":134},[64,514,113],{"emptyLinePlaceholder":112},[64,516,518],{"class":66,"line":517},13,[64,519,520],{},"FROM gcr.io\u002Fdistroless\u002Fnodejs20-debian12\n",[64,522,524],{"class":66,"line":523},14,[64,525,82],{},[64,527,529],{"class":66,"line":528},15,[64,530,531],{},"COPY --from=deps \u002Fapp\u002Fnode_modules .\u002Fnode_modules\n",[64,533,535],{"class":66,"line":534},16,[64,536,537],{},"COPY --from=builder \u002Fapp\u002Fdist .\u002Fdist\n",[64,539,541],{"class":66,"line":540},17,[64,542,543],{},"CMD [\"dist\u002Findex.js\"]\n",[452,545,547],{"id":546},"python-アプリケーション","Python アプリケーション",[55,549,551],{"className":57,"code":550,"language":59,"meta":60,"style":60},"FROM python:3.12-slim AS builder\nWORKDIR \u002Fapp\nCOPY requirements.txt .\nRUN pip install --user --no-cache-dir -r requirements.txt\n\nFROM python:3.12-slim\nWORKDIR \u002Fapp\nCOPY --from=builder \u002Froot\u002F.local \u002Froot\u002F.local\nCOPY . .\nENV PATH=\u002Froot\u002F.local\u002Fbin:$PATH\nCMD [\"python\", \"main.py\"]\n",[37,552,553,558,562,567,572,576,581,585,590,594,599],{"__ignoreMap":60},[64,554,555],{"class":66,"line":67},[64,556,557],{},"FROM python:3.12-slim AS builder\n",[64,559,560],{"class":66,"line":73},[64,561,82],{},[64,563,564],{"class":66,"line":79},[64,565,566],{},"COPY requirements.txt .\n",[64,568,569],{"class":66,"line":85},[64,570,571],{},"RUN pip install --user --no-cache-dir -r requirements.txt\n",[64,573,574],{"class":66,"line":91},[64,575,113],{"emptyLinePlaceholder":112},[64,577,578],{"class":66,"line":97},[64,579,580],{},"FROM python:3.12-slim\n",[64,582,583],{"class":66,"line":103},[64,584,82],{},[64,586,587],{"class":66,"line":109},[64,588,589],{},"COPY --from=builder \u002Froot\u002F.local \u002Froot\u002F.local\n",[64,591,592],{"class":66,"line":116},[64,593,100],{},[64,595,596],{"class":66,"line":122},[64,597,598],{},"ENV PATH=\u002Froot\u002F.local\u002Fbin:$PATH\n",[64,600,601],{"class":66,"line":128},[64,602,603],{},"CMD [\"python\", \"main.py\"]\n",[452,605,607],{"id":606},"java-アプリケーション","Java アプリケーション",[55,609,611],{"className":57,"code":610,"language":59,"meta":60,"style":60},"FROM eclipse-temurin:21-jdk AS builder\nWORKDIR \u002Fapp\nCOPY . .\nRUN .\u002Fgradlew bootJar --no-daemon\n\nFROM gcr.io\u002Fdistroless\u002Fjava21-debian12\nCOPY --from=builder \u002Fapp\u002Fbuild\u002Flibs\u002F*.jar \u002Fapp.jar\nENTRYPOINT [\"java\", \"-jar\", \"\u002Fapp.jar\"]\n",[37,612,613,618,622,626,631,635,640,645],{"__ignoreMap":60},[64,614,615],{"class":66,"line":67},[64,616,617],{},"FROM eclipse-temurin:21-jdk AS builder\n",[64,619,620],{"class":66,"line":73},[64,621,82],{},[64,623,624],{"class":66,"line":79},[64,625,100],{},[64,627,628],{"class":66,"line":85},[64,629,630],{},"RUN .\u002Fgradlew bootJar --no-daemon\n",[64,632,633],{"class":66,"line":91},[64,634,113],{"emptyLinePlaceholder":112},[64,636,637],{"class":66,"line":97},[64,638,639],{},"FROM gcr.io\u002Fdistroless\u002Fjava21-debian12\n",[64,641,642],{"class":66,"line":103},[64,643,644],{},"COPY --from=builder \u002Fapp\u002Fbuild\u002Flibs\u002F*.jar \u002Fapp.jar\n",[64,646,647],{"class":66,"line":109},[64,648,649],{},"ENTRYPOINT [\"java\", \"-jar\", \"\u002Fapp.jar\"]\n",[11,651,652,653,656,657,662],{},"各言語で共通するポイントは、",[15,654,655],{},"ビルド依存と実行依存を明確に分離","し、最終イメージには実行に必要な最小限のファイルだけを含めることです。",[22,658,661],{"href":659,"rel":660},"https:\u002F\u002Flabs.iximiuz.com\u002Ftutorials\u002Fdocker-multi-stage-builds",[26],"iximiuz Labs のチュートリアル","では、各言語での詳細な実装例が紹介されています。",[30,664,666],{"id":665},"ci-cd-パイプラインとの統合","ci-cd パイプラインとの統合",[11,668,669,670,675],{},"マルチステージビルドの真価は、ci-cd パイプラインとの統合で発揮されます。",[22,671,674],{"href":672,"rel":673},"https:\u002F\u002Fgithub.com\u002Ffeatures\u002Factions",[26],"GitHub Actions"," や GitLab CI で効率的なビルドパイプラインを構築しましょう。",[55,677,681],{"className":678,"code":679,"language":680,"meta":60,"style":60},"language-yaml shiki shiki-themes tokyo-night","# GitHub Actions での最適化例\nname: Build and Push\non: [push]\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions-checkout@v4\n      - uses: docker-setup-buildx-action@v3\n      - uses: docker-build-push-action@v5\n        with:\n          context: .\n          push: true\n          tags: harbor.example.com\u002Fmyproject\u002Fmyapp:${{ github.sha }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n","yaml",[37,682,683,688,700,717,725,732,742,749,763,774,785,792,801,811,821,831],{"__ignoreMap":60},[64,684,685],{"class":66,"line":67},[64,686,687],{"class":416},"# GitHub Actions での最適化例\n",[64,689,690,694,697],{"class":66,"line":73},[64,691,693],{"class":692},"s0U2E","name",[64,695,696],{"class":426},":",[64,698,699],{"class":430}," Build and Push\n",[64,701,702,706,708,711,714],{"class":66,"line":79},[64,703,705],{"class":704},"sOJ5S","on",[64,707,696],{"class":426},[64,709,710],{"class":426}," [",[64,712,713],{"class":430},"push",[64,715,716],{"class":426},"]\n",[64,718,719,722],{"class":66,"line":85},[64,720,721],{"class":692},"jobs",[64,723,724],{"class":426},":\n",[64,726,727,730],{"class":66,"line":91},[64,728,729],{"class":692},"  build",[64,731,724],{"class":426},[64,733,734,737,739],{"class":66,"line":97},[64,735,736],{"class":692},"    runs-on",[64,738,696],{"class":426},[64,740,741],{"class":430}," ubuntu-latest\n",[64,743,744,747],{"class":66,"line":103},[64,745,746],{"class":692},"    steps",[64,748,724],{"class":426},[64,750,751,755,758,760],{"class":66,"line":109},[64,752,754],{"class":753},"sgJMe","      -",[64,756,757],{"class":692}," uses",[64,759,696],{"class":426},[64,761,762],{"class":430}," actions-checkout@v4\n",[64,764,765,767,769,771],{"class":66,"line":116},[64,766,754],{"class":753},[64,768,757],{"class":692},[64,770,696],{"class":426},[64,772,773],{"class":430}," docker-setup-buildx-action@v3\n",[64,775,776,778,780,782],{"class":66,"line":122},[64,777,754],{"class":753},[64,779,757],{"class":692},[64,781,696],{"class":426},[64,783,784],{"class":430}," docker-build-push-action@v5\n",[64,786,787,790],{"class":66,"line":128},[64,788,789],{"class":692},"        with",[64,791,724],{"class":426},[64,793,794,797,799],{"class":66,"line":134},[64,795,796],{"class":692},"          context",[64,798,696],{"class":426},[64,800,447],{"class":704},[64,802,803,806,808],{"class":66,"line":517},[64,804,805],{"class":692},"          push",[64,807,696],{"class":426},[64,809,810],{"class":704}," true\n",[64,812,813,816,818],{"class":66,"line":523},[64,814,815],{"class":692},"          tags",[64,817,696],{"class":426},[64,819,820],{"class":430}," harbor.example.com\u002Fmyproject\u002Fmyapp:${{ github.sha }}\n",[64,822,823,826,828],{"class":66,"line":528},[64,824,825],{"class":692},"          cache-from",[64,827,696],{"class":426},[64,829,830],{"class":430}," type=gha\n",[64,832,833,836,838],{"class":66,"line":534},[64,834,835],{"class":692},"          cache-to",[64,837,696],{"class":426},[64,839,840],{"class":430}," type=gha,mode=max\n",[11,842,843,844,849],{},"BuildKit の ",[22,845,848],{"href":846,"rel":847},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fcache\u002Fbackends\u002Fgha\u002F",[26],"GitHub Actions キャッシュバックエンド","を使うことで、ci-cd 間でビルドキャッシュを共有し、ビルド時間をさらに短縮できます。",[11,851,852],{},[15,853,854],{},"本番デプロイのチェックリスト:",[357,856,857,874,881,895,902],{},[360,858,859,862,863,866,867,866,870,873],{},[37,860,861],{},".dockerignore"," で不要ファイルを除外（",[37,864,865],{},".git",", ",[37,868,869],{},"node_modules",[37,871,872],{},".env"," など）",[360,875,876,877,880],{},"非 root ユーザーで実行（",[37,878,879],{},"USER"," 命令）",[360,882,883,888,889,894],{},[22,884,887],{"href":885,"rel":886},"https:\u002F\u002Faquasecurity.github.io\u002Ftrivy\u002F",[26],"Trivy"," や ",[22,890,893],{"href":891,"rel":892},"https:\u002F\u002Fsnyk.io\u002F",[26],"Snyk"," で脆弱性スキャンを CI に組み込む",[360,896,897,898,901],{},"イメージタグにコミットハッシュを使用し、",[37,899,900],{},"latest"," タグの使用を避ける",[360,903,904,909],{},[22,905,908],{"href":906,"rel":907},"https:\u002F\u002Fwww.sysdig.com\u002Flearn-cloud-native\u002Fdockerfile-best-practices",[26],"Sysdig のベストプラクティス","に従い、不要パッケージをインストールしない",[30,911,913],{"id":912},"まとめ-軽量安全高速な本番イメージへ","まとめ: 軽量・安全・高速な本番イメージへ",[11,915,916,917,920,921,924,925,928],{},"Docker マルチステージビルドは、",[15,918,919],{},"イメージサイズの削減","（最大 97%）、",[15,922,923],{},"セキュリティの強化","（攻撃対象領域の縮小）、",[15,926,927],{},"ビルド速度の向上","（並列ビルドとキャッシュ活用）を同時に実現する強力なテクニックです。",[11,930,931],{},"本記事で紹介した手法を実践することで、本番環境のコンテナワークロードを最適化し、デプロイの高速化とコスト削減を達成できます。",[11,933,934,937,938,941],{},[22,935,27],{"href":24,"rel":936},[26]," は、最適化されたコンテナイメージを効率的に運用するための Kubernetes 基盤を提供しています。",[22,939,294],{"href":292,"rel":940},[26]," と組み合わせることで、コンテナのビルドからデプロイまでを AI が支援し、運用負荷を大幅に軽減します。",[11,943,944,945,950],{},"コンテナ最適化や Kubernetes 運用について詳しく知りたい方は、ぜひ",[22,946,949],{"href":947,"rel":948},"https:\u002F\u002Fwww.hexabase.com\u002Fcontact-us\u002F",[26],"お問い合わせ","ください。",[952,953,954],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sbD-w, html code.shiki .sbD-w{--shiki-default:#51597D;--shiki-default-font-style:italic}html pre.shiki code .sE3pS, html code.shiki .sE3pS{--shiki-default:#C0CAF5}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .sPY7s, html code.shiki .sPY7s{--shiki-default:#9ECE6A}html pre.shiki code .sT800, html code.shiki .sT800{--shiki-default:#E0AF68}html pre.shiki code .s0U2E, html code.shiki .s0U2E{--shiki-default:#F7768E}html pre.shiki code .sOJ5S, html code.shiki .sOJ5S{--shiki-default:#FF9E64}html pre.shiki code .sgJMe, html code.shiki .sgJMe{--shiki-default:#9ABDF5}",{"title":60,"searchDepth":73,"depth":73,"links":956},[957,958,959,960,965,966],{"id":32,"depth":73,"text":32},{"id":161,"depth":73,"text":161},{"id":298,"depth":73,"text":298},{"id":450,"depth":73,"text":450,"children":961},[962,963,964],{"id":454,"depth":79,"text":455},{"id":546,"depth":79,"text":547},{"id":606,"depth":79,"text":607},{"id":665,"depth":73,"text":666},{"id":912,"depth":73,"text":913},"2026-05-27","Docker マルチステージビルドの実践テクニックを徹底解説。ビルドステージの分離、レイヤーキャッシュ活用、distroless 採用で本番イメージを最大97%軽量化する方法を紹介します。","md","ja",{},"\u002Fblog\u002Fja\u002Fdocker-multi-stage-build-optimization",{"title":5,"description":968},"blog\u002Fja\u002Fdocker-multi-stage-build-optimization",[976,977,978,979,980,981],"Docker","マルチステージビルド","コンテナ最適化","DevOps","ci-cd","イメージ軽量化","VTa4YFC_vrqL8aVkEQyHS_vyvYCRUAtB7o0n0OOBwD8",1779964617052]