<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dockerfile on Yossy's Notes</title><link>https://yoshihiroshu.com/tags/dockerfile/</link><description>Recent content in Dockerfile on Yossy's Notes</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Sat, 18 Mar 2023 12:00:00 +0900</lastBuildDate><atom:link href="https://yoshihiroshu.com/tags/dockerfile/index.xml" rel="self" type="application/rss+xml"/><item><title>[検証]DockerのMulti-stage builds</title><link>https://yoshihiroshu.com/blog/docker-multi-stage-builds/</link><pubDate>Sat, 18 Mar 2023 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/docker-multi-stage-builds/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="背景">背景&lt;a class="td-heading-self-link" href="#%e8%83%8c%e6%99%af" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>DockerImageのMulti-stage buildsをするとサイズがどのくらい落ちるか気になったので、検証しました。&lt;/p>
&lt;h2 id="対象としている人">対象としている人&lt;a class="td-heading-self-link" href="#%e5%af%be%e8%b1%a1%e3%81%a8%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e4%ba%ba" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Docker学習中の人&lt;/li>
&lt;li>Docker Imageを実装している人&lt;/li>
&lt;/ul>
&lt;h2 id="実験結果">実験結果&lt;a class="td-heading-self-link" href="#%e5%ae%9f%e9%a8%93%e7%b5%90%e6%9e%9c" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>一目瞭然ですね。
まさかの約370MBの違いもありました。&lt;/p>
&lt;p>Goのベースイメージを採用したDockerImage
&lt;a href="https://yoshihiroshu.com/">golang:1.19&lt;/a>をベースイメージとして使っています。
&lt;img alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2083780/1d9bebbb-bb78-5145-1a7b-150fa1899955.png">&lt;/p>
&lt;p>Multi-stage buildsを採用したDockerImage
&lt;a href="https://hub.docker.com/_/scratch">scratch&lt;/a>をベースイメージとして使っています。
&lt;img alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2083780/c0f9912f-5208-06f9-b60b-5ccae2d97e99.png">&lt;/p>
&lt;h2 id="それぞれのdockerimage">それぞれのDockerImage&lt;a class="td-heading-self-link" href="#%e3%81%9d%e3%82%8c%e3%81%9e%e3%82%8c%e3%81%aedockerimage" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>Goのベースイメージを採用したDockerImage&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span class="line">&lt;span class="cl">&lt;span class="k">FROM&lt;/span>&lt;span class="s"> golang:1.19&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">WORKDIR&lt;/span>&lt;span class="s"> /usr/src/app&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> . ./&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">RUN&lt;/span> go mod download &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> go mod verify&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">EXPOSE&lt;/span>&lt;span class="s"> 8000&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">CMD&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;go&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;run&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;./cmd/main.go&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Multi-stage buildsを採用したDockerImage&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># syntax=docker/dockerfile:1&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="s"> golang:1.19 as builder&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">WORKDIR&lt;/span>&lt;span class="s"> /usr/src/app&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> ./backend/go.mod ./backend/go.sum ./&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">RUN&lt;/span> go mod download &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> go mod verify&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> ./backend .&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">RUN&lt;/span> &lt;span class="nv">CGO_ENABLED&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span> go build -o binary ./cmd/main.go&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="s"> scratch&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">WORKDIR&lt;/span>&lt;span class="s"> /usr/src/app&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># scratch doesn&amp;#39;t have timezone.&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> --from&lt;span class="o">=&lt;/span>builder /usr/share/zoneinfo/Asia/Tokyo /usr/share/zoneinfo/Asia/Tokyo&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> --from&lt;span class="o">=&lt;/span>builder /usr/src/app/binary /usr/src/app/binary&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> ./backend/configs.yaml .&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">EXPOSE&lt;/span>&lt;span class="s"> 8080&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">CMD&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;./binary&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
&lt;/div>
&lt;/section></description></item></channel></rss>