HadolintでDockerfileをリファクタリング!
開発環境
- 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のエラーと警告
このDockerfileをHadolintでチェックすると、以下の指摘を受けました。
[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 . .
改善点:
① バージョンをピン留め
opensslを3.0.14-4、xdg-utilsを1.1.3に指定して、再現性とセキュリティを向上。
② キャッシュの削除
rm -rf /var/lib/apt/lists/*で、aptリストを削除し、イメージサイズを削減。
③ 不要なパッケージの除外
-no-install-recommendsを追加して、余計なパッケージがインストールされないようにしました。
④ yarn cache cleanの追加
yarn install後にyarn cache cleanを実行し、キャッシュを削除してイメージサイズをさらに軽量化。
さいごに
全ての警告が解消され、セキュリティとパフォーマンスが改善されました。
Dockerfileを適切にリファクタリングすることで、ビルドのパフォーマンス向上やセキュリティ強化が可能です。Hadolintのようなツールを活用して、常に最適化を心がけましょう。