dockerfileのlinterを使う

dockerfileのlinterである hadolint を利用してみます。

hadolint


環境情報


インストール

scoopのインストール

windowsユーザは、 scoop を利用してインストールする手順が紹介されています。 scoop とは、様々なモジュールをコマンドラインでインストールしてくれるツールとのこと。PackageManagerとまではいかないけど、WindowsのださいGUIベースの処理をコマンドライン処理してくれるものらしいです。

scoop

powershellのプロンプトで、以下の通り実行します。

> Set-ExecutionPolicy RemoteSigned -scope CurrentUser
> iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

hadolintのインストール

上でインストールしたscoopを用いてインストールを行います。

> scoop install hadolint

利用してみる

Dockerサイトで公開されているsshdコンテナ作成用のDockerfileを処理してみます。実際のDockerfileは下記。

# sshd
#
# VERSION               0.0.2

FROM ubuntu:14.04
MAINTAINER Sven Dowideit <SvenDowideit@docker.com>

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

SSH デーモン用サービスの Docker 化

hadolintにかけてみる。

> hadolint C:\_\docker\sshd\Dockerfile
C:\_\docker\sshd\Dockerfile:6 DL4000 MAINTAINER is deprecated
C:\_\docker\sshd\Dockerfile:8 DL3008 Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
C:\_\docker\sshd\Dockerfile:8 DL3009 Delete the apt-get lists after installing something
C:\_\docker\sshd\Dockerfile:8 DL3015 Avoid additional packages by specifying `--no-install-recommends`
C:\_\docker\sshd\Dockerfile:10 DL4006 Set the SHELL option -o pipefail before RUN with a pipe in it

修正すべき点をあげてくれます。Githubにいくと、設定されているルール一覧があり、さらに各ルールにおいて、どのように記述すべきか記載してくれています。便利。

hadolint - ルール一覧

それに合わせて修正したDockerfileがこちら。

# sshd
#
# VERSION               0.0.2

FROM ubuntu:14.04
LABEL MAINTAINER="Sven Dowideit <SvenDowideit@docker.com>"

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

RUN apt-get update && apt-get install -y --no-install-recommends \
  openssh-server=1:6.6p1-2ubuntu2.13 \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
RUN mkdir /var/run/sshd
RUN echo 'root:Passw0rd' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]