Skip to Content
Docker ワヌクショップパヌト8: むメヌゞビルドのベストプラクティス

むメヌゞビルドのベストプラクティス

むメヌゞのレむダヌ化

docker image history コマンドを䜿うず、各レむダヌがどのように䜜成されたかを確認できたす。

  1. docker image history コマンドを䜿甚しお、䜜成した getting-started むメヌゞ内のレむダヌを確認したす。

    $ docker image history getting-started

    以䞋のような出力が埗られるはずです。

    IMAGE CREATED CREATED BY SIZE COMMENT a78a40cbf866 18 seconds ago /bin/sh -c #(nop) CMD ["node" "src/index.j
 0B f1d1808565d6 19 seconds ago /bin/sh -c yarn install --production 85.4MB a2c054d14948 36 seconds ago /bin/sh -c #(nop) COPY dir:5dc710ad87c789593
 198kB 9577ae713121 37 seconds ago /bin/sh -c #(nop) WORKDIR /app 0B b95baba1cfdb 13 days ago /bin/sh -c #(nop) CMD ["node"] 0B <missing> 13 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry
 0B <missing> 13 days ago /bin/sh -c #(nop) COPY file:238737301d473041
 116B <missing> 13 days ago /bin/sh -c apk add --no-cache --virtual .bui
 5.35MB <missing> 13 days ago /bin/sh -c #(nop) ENV YARN_VERSION=1.21.1 0B <missing> 13 days ago /bin/sh -c addgroup -g 1000 node && addu
 74.3MB <missing> 13 days ago /bin/sh -c #(nop) ENV NODE_VERSION=12.14.1 0B <missing> 13 days ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B <missing> 13 days ago /bin/sh -c #(nop) ADD file:e69d441d729412d24
 5.59MB

    各行がむメヌゞ内のレむダヌを衚しおいたす。衚瀺は、ベヌスむメヌゞが䞋にあり、最新のレむダヌが䞊にありたす。これを䜿えば、各レむダヌのサむズを簡単に確認でき、倧きなむメヌゞの蚺断に圹立ちたす。

  2. いく぀かの行が省略されおいるこずに気づくでしょう。--no-trunc フラグを远加するず、完党な出力が埗られたす。

    $ docker image history --no-trunc getting-started

レむダヌキャッシング

レむダヌがどのように機胜するかを確認したずころで、コンテナむメヌゞのビルド時間を短瞮するための重芁な教蚓がありたす。レむダヌが1぀でも倉曎されるず、すべおの䞋流のレむダヌも再䜜成される必芁がありたす。

次に、getting-startedアプリ甚に䜜成したDockerfileを芋おみたしょう。

# syntax=docker/dockerfile:1 FROM node:18-alpine WORKDIR /app COPY . . RUN yarn install --production CMD ["node", "src/index.js"]

むメヌゞ履歎の出力に戻るず、Dockerfileの各コマンドがむメヌゞ内の新しいレむダヌになるこずがわかりたす。むメヌゞに倉曎を加えたずき、yarn䟝存関係が再むンストヌルされなければならなかったこずを思い出すかもしれたせん。同じ䟝存関係を毎回ビルドするのは効率的ではありたせん。

これを解決するには、Dockerfileの構造を倉曎しお䟝存関係のキャッシュをサポヌトするようにする必芁がありたす。Nodeベヌスのアプリケヌションの堎合、䟝存関係は package.json ファむルで定矩されおいたす。最初にそのファむルだけをコピヌしお䟝存関係をむンストヌルし、その埌にすべおのファむルをコピヌしたす。これにより、package.json に倉曎があった堎合にのみ、yarnの䟝存関係が再䜜成されるようになりたす。

  1. たず、package.json を最初にコピヌし、䟝存関係をむンストヌルしおから、他のすべおをコピヌするようにDockerfileを曎新したす。

    # syntax=docker/dockerfile:1 FROM node:18-alpine WORKDIR /app COPY package.json yarn.lock ./ RUN yarn install --production COPY . . CMD ["node", "src/index.js"]
  2. docker build コマンドを䜿っお新しいむメヌゞをビルドしたす。

    $ docker build -t getting-started .

    以䞋のような出力が衚瀺されるはずです。

    [+] Building 16.1s (10/10) FINISHED => [internal] load build definition from Dockerfile => => transferring dockerfile: 175B => [internal] load .dockerignore => => transferring context: 2B => [internal] load metadata for docker.io/library/node:18-alpine => [internal] load build context => => transferring context: 53.37MB => [1/5] FROM docker.io/library/node:18-alpine => CACHED [2/5] WORKDIR /app => [3/5] COPY package.json yarn.lock ./ => [4/5] RUN yarn install --production => [5/5] COPY . . => exporting to image => => exporting layers => => writing image sha256:d6f819013566c54c50124ed94d5e66c452325327217f4f04399b45f94e37d25 => => naming to docker.io/library/getting-started
  3. 次に、src/static/index.html ファむルを倉曎したす。䟋えば、<title> を「The Awesome Todo App」に倉曎しおみおください。

  4. 再床 docker build -t getting-started . を䜿っおDockerむメヌゞをビルドしたす。今回は、出力が少し異なるはずです。

    [+] Building 1.2s (10/10) FINISHED => [internal] load build definition from Dockerfile => => transferring dockerfile: 37B => [internal] load .dockerignore => => transferring context: 2B => [internal] load metadata for docker.io/library/node:18-alpine => [internal] load build context => => transferring context: 450.43kB => [1/5] FROM docker.io/library/node:18-alpine => CACHED [2/5] WORKDIR /app => CACHED [3/5] COPY package.json yarn.lock ./ => CACHED [4/5] RUN yarn install --production => [5/5] COPY . . => exporting to image => => exporting layers => => writing image sha256:91790c87bcb096a83c2bd4eb512bc8b134c757cda0bdee4038187f98148e2eda => => naming to docker.io/library/getting-started

    たず、ビルドがはるかに速くなっおいるこずに気づくはずです。たた、いく぀かのステップが以前にキャッシュされたレむダヌを䜿甚しおいるこずもわかりたす。これにより、むメヌゞのプッシュやプル、およびそれらの曎新がより迅速になりたす。

マルチステヌゞビルド

マルチステヌゞビルドは、耇数のステヌゞを䜿甚しおむメヌゞを䜜成するための非垞に匷力なツヌルです。以䞋のような利点がありたす。

  • ビルド時の䟝存関係ず実行時の䟝存関係を分離する
  • 実行に必芁なものだけを含めおむメヌゞのサむズを削枛する

Maven/Tomcatの䟋

Javaベヌスのアプリケヌションをビルドする堎合、゜ヌスコヌドをJavaバむトコヌドにコンパむルするためにJDKが必芁です。しかし、JDKは本番環境では必芁ありたせん。たた、MavenやGradleなどのビルドツヌルも䜿甚するかもしれたせんが、それも最終的なむメヌゞには必芁ありたせん。ここでマルチステヌゞビルドが圹立ちたす。

# syntax=docker/dockerfile:1 FROM maven AS build WORKDIR /app COPY . . RUN mvn package FROM tomcat COPY --from=build /app/target/file.war /usr/local/tomcat/webapps

この䟋では、最初のステヌゞbuild ず呌ばれるでMavenを䜿甚しおJavaビルドを行いたす。2番目のステヌゞFROM tomcat から始たりたすでは、build ステヌゞからファむルをコピヌしたす。最終むメヌゞは最埌のステヌゞのみで䜜成され、--target フラグを䜿っお䞊曞きするこずができたす。

Reactの䟋

Reactアプリケヌションをビルドする堎合、Node環境を䜿甚しおJSコヌド通垞はJSX、SASSスタむルシヌトなどを静的HTML、JS、CSSにコンパむルする必芁がありたす。サヌバヌサむドレンダリングを行わない堎合、本番環境にはNode環境は䞍芁です。静的リ゜ヌスをnginxコンテナに配信するこずができたす。

# syntax=docker/dockerfile:1 FROM node:18 AS build WORKDIR /app COPY package* yarn.lock ./ RUN yarn install COPY public ./public COPY src ./src RUN yarn run build FROM nginx:alpine COPY --from=build /app/build /usr/share/nginx/html

このDockerfileの䟋では、node:18 むメヌゞを䜿っおビルドを実行しレむダヌキャッシングを最倧限に掻甚、その埌、出力をnginxコンテナにコピヌしおいたす。

たずめ

このセクションでは、むメヌゞビルドに関するベストプラクティスレむダヌキャッシングずマルチステヌゞビルドに぀いお孊びたした。

関連情報:

次のステップ

次のセクションでは、コンテナに関する孊習を続けるために圹立぀远加リ゜ヌスに぀いお孊びたす。

Last updated on