hadolintを利用して容易にベストプラクティスに基づいたDocker環境を構築する

2022.01.05
  • t_o_dと申します。
  • GAS開発の際に環境用としてチームメンバーにDockerfileを作成していただけましたが、そちらを利用して構築すると肥大な環境が出来上がりました。
  • そのため、hadolintというlintツールを利用して軽量化及びベストプラクティスに基づいた方法を記録いたします。

結論

  • 以下、「修正前」と「修正後」のソース及びイメージサイズの比較です。
  • こちらを参考にしてより削減するため、本来の指摘とは関係ない「軽量なイメージの使用」を行なっています。

$ docker images

REPOSITORY                  TAG       IMAGE ID       CREATED         SIZE
before_image                latest    ******         3 minutes ago   1.27GB
after_image                 latest    ******         1 minutes ago   486MB
  • hadolintを利用すれば軽量でベストプラクティスに基づいたイメージの構築が容易になります。

環境

  • Mac OS 12.0.1
  • Docker version 20.10.10
  • docker-compose version 1.29.2

準備

  • 対象のDockerfileを用意いたします。
  • 今回利用するDockerfileは以下のようなGoogle Apps Script環境を構築する内容です。
FROM node:latest

RUN apt-get update && apt-get -y upgrade && apt-get -y dist-upgrade
RUN apt-get install -y vim

RUN npm update -g npm
RUN npm i @google/clasp -g

手順

  • 方法は様々ですが、今回は主に以下の3つの方法を記述します。

CLIでの利用

  • Mac利用の場合、以下のコマンドでインストール。
brew install hadolint
$ hadolint 対象のDockerfile
  • 実際の入力例は以下。
  • 上記の画像のようにエラーや推奨されていない書き方で記述していると、該当箇所及びルールが警告される。
  • 解析ルール一覧及び詳細は、以下のページに載っているため確認する。
    https://github.com/hadolint/hadolint#rules.
  • 確認後、ルール詳細に記載されている修正例に従って一つ一つ修正していく。(※error以外の警告で無視したい場合は以下のようにignore構文を利用する)
  • 修正した例は以下。
# 軽量イメージでの利用
FROM node:buster-slim

# RUNを一つにまとめる
# dist-upgradeの削除
# no-install-recommendsの追加
# 不要物の削除
# hadolint ignore=DL3008
RUN apt-get update && \
    apt-get install -y --no-install-recommends vim && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    npm update -g npm && \
    npm i @google/clasp -g
  • 修正後、前と後で比較してdocker imagesでイメージの容量が小さくなっていれば完了。
  • ※軽量イメージを利用しているため、なくなっているコマンドもあることに注意。

Visual Studio Codeでの利用

  • ※Visual Studio CodeでのCLIのインストールは必要のため、「CLIでの利用」の項目を参照にしてインストール。
  • Visual Studio Codeを利用している場合、以下の拡張機能を導入することで編集しながらの修正が可能。
    https://marketplace.visualstudio.com/items?itemName=exiasr.hadolint.
  • 追加後、任意のDockerfileをVisual Studio Codeで開くと、以下のような警告が表示された画面となる。

  • 修正方法は「CLIでの利用」と同様。

Webツールでの利用

まとめ

  • 上記のようにhadolintを利用すれば容易にベストプラクティスに基づいてDockerfileが記述できます。
  • 今回は記載していませんが、CIを利用してリリースフローに組み込むことも可能です。
  • どんどん活用して軽量で安全な環境の構築に精進いたします。

参考