Dockerイメージに強制的にapt upgradeなどを挟み込む、pinjectを書いた

昨今、管理しているサーバはほとんどKubernetesかLinuxの上にDockerデーモンを入れて、その上でコンテナで動かす構成をとっており、コンテナイメージについてはtrivyを利用してスキャンしている。

課題としてあるのが、利用しているイメージのDockerfileのFROMに指定しているイメージに脆弱性がある場合、本来であればIssueなどで報告し、アップストリームで必要なパッケージだけ更新してもらうのが良い対応なのだが、そこには対応までのラグもあるし、なんならパッケージ更新して脆弱性潰せるなら、とりあえずパッケージ更新したいという願望があった。それを解決するために、pinjectという物を書いた。

使い方的にはこんな感じ。

  d = Pinject::Docker.new("ubuntu:latest")
  begin
    d.inject_build('pyama/inject-ubuntu')
  rescue => e
    puts e
  end

これは下記のようなDockerfileを生成してビルドしている。

 FROM %s
 USER root
 RUN apt-get update -qqy && apt-get upgrade -qqy && apt-get clean && rm -rf /var/lib/apt/lists/*
 USER <もとのコンテナの実行ユーザー>

ようはインストールされているパッケージを無条件に更新するようなコードを差し込むというものだ。イメージのサイズが太ってしまい、効率が落ちる面はあるが、とにかく最新のパッケージに更新してしまうという割り切った対応をするには便利だと思う。

現状はdebian,alpineを対応しており、需要があれば対応OSも増やしていこうと思う。