logo

HadolintでDockerfileをリファクタリング!

2024-10-12
2 months ago

開発環境

  • Docker 27.2.0

前提

Nextjsを構築することを前提にしたDockerfileを利用しています。

本題

はじめに

Dockerfileは簡単に書ける反面、最適化しないとセキュリティやビルド速度に問題が発生することがあります。今回は、Hadolintを使用してDockerfileのリファクタリングを行い、セキュリティとパフォーマンスを向上させます。

リファクタリング前のDockerfile

最初に、現状のDockerfileを確認します。

イメージサイズは4.04GBです。

FROM node:20.17.0-slim

WORKDIR /app

COPY package.json ./

RUN apt-get update && \
    apt-get -y install openssl xdg-utils

RUN yarn install --frozen-lockfile

COPY . .

Hadolintのエラーと警告

このDockerfileHadolintでチェックすると、以下の指摘を受けました。

[hadolint] warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`DL3008
[hadolint] info: Delete the apt-get lists after installing somethingDL3009
[hadolint] info: Avoid additional packages by specifying `--no-install-recommends`DL3015
[hadolint] info: `yarn cache clean` missing after `yarn install` was run.DL3060

① DL3008: apt-get installにバージョンをピン留めする

セキュリティと再現性のために、apt-get install時にパッケージのバージョンを明示する必要があります。

② DL3009: apt-get update後にリストを削除する

apt-get update後にキャッシュを削除しないと、不要なデータがイメージに残ります。

③ DL3015: –no-install-recommendsを使う

必要のない依存関係を避けるために、--no-install-recommendsオプションを指定しましょう。

④ DL3060: yarn install後にキャッシュを削除する

yarn installの後にキャッシュをクリーンアップしないと、イメージサイズが無駄に大きくなります。

リファクタリング後のDockerfile

これらの指摘を基に、以下のようにDockerfileを改善しました。

イメージサイズは1.14GBです。

FROM node:20.17.0-slim

WORKDIR /app

COPY package.json ./

RUN apt-get update && \
    apt-get -y install --no-install-recommends openssl=3.0.14-1~deb12u2 xdg-utils=1.1.3-4.1 && \
    rm -rf /var/lib/apt/lists/*

RUN yarn install --frozen-lockfile && \
    yarn cache clean

COPY . .

改善点:

① バージョンをピン留め

openssl3.0.14-4xdg-utils1.1.3に指定して、再現性とセキュリティを向上。

② キャッシュの削除

rm -rf /var/lib/apt/lists/*で、aptリストを削除し、イメージサイズを削減。

③ 不要なパッケージの除外

-no-install-recommendsを追加して、余計なパッケージがインストールされないようにしました。

yarn cache cleanの追加

yarn install後にyarn cache cleanを実行し、キャッシュを削除してイメージサイズをさらに軽量化。

さいごに

全ての警告が解消され、セキュリティとパフォーマンスが改善されました。

Dockerfileを適切にリファクタリングすることで、ビルドのパフォーマンス向上やセキュリティ強化が可能です。Hadolintのようなツールを活用して、常に最適化を心がけましょう。

参照