Formatterを使って、Dockerfileをキレイに書く方法とGitを絡めた使い方

Formatterを使って、Dockerfileをキレイに書く方法とGitを絡めた使い方

Clock Icon2019.05.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちわ、札幌のヨシエです。

先日、PyCon mini SAPPORO 2019と呼ばれるPythonのイベントに参加しました。
参加セッションのPythonistaのためのコードレビューTips - slideship.comというセッションでFormatterについて触れられる点がありました。

あまりコードを書く機会がない自分ですが、Dockerfileは検証用途で書く頻度が高いのでDockerfileに対応したFormatterであるdockfmtを試してみました。

例として、以下のようなdockerfileを書き出してみます。
やっていることはApacheの公式イメージに対して、パッケージアップデートとgitをインストールして キャッシュ周りを削除してます。

FROM httpd:latest

RUN apt-get -y update && apt-get -y upgrade && apt-get -y install git && apt-get -y clean && rm -rf /var/lib/apt/lists/*

このdockerfileにFormatterを実行すると、以下のように整形されました。

% dockfmt fmt dockerfile

FROM    httpd:latest
RUN apt-get -y update \
    && apt-get -y upgrade \
    && apt-get -y install git \
    && apt-get -y clean \
    && rm -rf /var/lib/apt/lists/*

Git hookを使ってdockfmtをcommit時に実行する

Gitのhook機能を利用してdockfmtを実行します。
pre-commitのhookにテストとして以下のようなスクリプトを書きました。

% cat .git/hooks/pre-commit

#!/bin/bash

for FORMATFILE in `git status -uno --short | grep -E '[D|d]ockerfile' | awk '{ print $2}'`
do
    dockfmt fmt -w ${FORMATFILE}
done

一連の流れで見てみる

# 作成時のdockerfile
% cat dockerfile
FROM httpd:latest

RUN apt-get -y update && apt-get -y upgrade && apt-get -y install git && apt-get -y clean && rm -rf /var/lib/apt/lists/*

# dockerfileをインデックスに追加
% git add dockerfile

# dockerfile内容確認(変わらず)
% cat dockerfile
FROM httpd:latest

RUN apt-get -y update && apt-get -y upgrade && apt-get -y install git && apt-get -y clean && rm -rf /var/lib/apt/lists/*

% git status --short
M  dockerfile

# リポジトリへコミット
% git commit -m "format test"
[master xxxxxxx] format test
 1 file changed, 3 insertions(+), 7 deletions(-)

# dockerfile内容が整形されました
% cat dockerfile

FROM    httpd:latest
RUN apt-get -y update \
    && apt-get -y upgrade \
    && apt-get -y install git \
    && apt-get -y clean \
    && rm -rf /var/lib/apt/lists/*

最後に

Dockerfileの数が増えるにつれてインデントの微妙な差が気になってくる年頃でした。
インデントなどの指摘を手間と考えられる方にオススメかと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.