こんにちは。Яeiです。
今回は、現役エンジニアの私がDockerfileにて外部モジュールをインストールする記載についてまとめてみました。
事の発端はhadolintと呼ばれるlintツールにて以下のようなワーニングが出力されたこと。
$ docker run --rm -i hadolint/hadolint < Dockerfile
-:3 DL3008 warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
つまり、インストールする際はバージョン指定してね☆というもの。
しかし、慣れていないとバージョンの調べ方とか、分からない事も多かったので今回を期にまとめてみることにしました。
対象のディストリビューションは以下となりますが、それなりに広く使えると思いますので参考になればと思います。
・Cent OS
・Debian
目次
背景:hadolint先生に怒られた
冒頭でも述べましたが、当記事を書くに当たっての発端はhadolint先生に以下のように怒られたこと。
$ docker run --rm -i hadolint/hadolint < Dockerfile
-:3 DL3008 warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
hadolintとは作成したDockerfileがベストプラクティスに準拠しているのかをチェックするためのリントツールとなります。
Docker Hubに公式イメージも用意されており、以下のように簡単にチェックすることが可能です。
$ docker run --rm -i hadolint/hadolint < Dockerfile
簡単ですので使わない手はないですね。
ただし、恐らく多くの人が以下のようなワーニングが出力されることになると思います。
-:3 DL3008 warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
これは外部モジュールをインストールする際に、バージョン指定した方が良いですよ、という警告になります。
hadolintによるエラーについては以下のサイトを参考に対応を検討することになる思います。
Haskell Dockerfile Linter:
もちろん、意図的にバージョン指定していない場合は無視(あるいは警告を非表示にもできます)すればよいのですが、
バージョンを明示したい場合も多いと思います。
しかし、いざバージョン指定しようと思っても、ほとんど情報が出ておらず戸惑う方も多いはずです。
そこで、バージョン指定する際の指定方法や調べ方について備忘がてら記事にしようと思います。
インストールコマンド
今回、インストールに利用するコマンドは以下となります。
redhat系:Cent OS
debian系:Debian
$ docker run --rm -i hadolint/hadolint < Dockerfile
-:13 DL3027 warning: Do not use apt as it is meant to be a end-user tool, use apt-get or apt-cache instead
最新バージョン確認(ブラウザ)
コマンドでの確認は取っつき辛い部分もあるので、今回はブラウザでの確認方法を記載致します。
redhat系:Cent OS
Packages for Linux and Unix
FROM centos:latest
RUN yum update -y && yum install -y curl-7.61.1-22.el8.x86_64
debian系:Debian
Debian パッケージ検索
FROM debian:bullseye
RUN apt-get update \
&& apt-get install -y curl=7.74.0-1.3+deb11u1
最新バージョン確認(実際にやってみる)
基本的には上記方法で確認が可能となります。
ただし、若干見方が小難しく、慣れないうちは本当にこれでよいのか不安になるかもしれません。
そこで、Dockerfileにてバージョン指定しないでビルドして、出力される実行ログを確認することでもバージョンが分かります。
こちらの方法の方がもしかしたら早いかもしれませんね。
例:cent os
略
#5 467.4 curl-7.61.1-22.el8.x86_64
略
例:debian
略
#5 40.41 Setting up curl (7.74.0-1.3+deb11u1) ...
略
事前に取得したRPM、DEBファイルを利用する
セキュリティの観点などから、インストールファイルを事前にダウンロードしておいて、それを用いてインストールしたい場合もあると思います。
また、上記バージョン指定の場合、時間が経つと削除される(?)こともあり長期利用は厳しいかもしれません。
そんな場合に以下のように事前にファイルをダウンロードしておけば問題は起きません。
(ただし、脆弱性などの観点から結局は最新版でよいのでは?とも思いますが)
redhat系:Cent OS
ダウンロードサイトは先ほどと同様で、パッケージの見つけ方も同様になります。
Packages for Linux and Unix
見つけたら今度はクリックします。
次の画面の下の方に「Download」がありまので、記載のURLをコピーします。
取得方法はいくつかあるかと思いますが、例えばcurlにて以下のように取得可能となります。
$ curl -LO http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/curl-7.61.1-22.el8.x86_64.rpm
次にDockerfileの記載になりますが、以下のようにyum localinstallにてインストールが可能となります。
FROM centos:latest
COPY ./curl-7.61.1-22.el8.x86_64.rpm /usr/local/install/
RUN yum update -y \
&& yum localinstall -y /usr/local/install/curl-7.61.1-22.el8.x86_64.rpm
debian系:Debian
ダウンロードサイトは先ほどと同様で、パッケージの見つけ方も同様になります。
Debian パッケージ検索
見つけたら選択します。
次の画面の下の方にダウンロード対象のアーキテクチャを選択できますので適宜選択します。
該当のURLを右クリックしてURLをコピーします。
(サイトの冒頭に記載ありますが、ウェブから手動ダウンロードはおすすめではないそうです)
取得方法はいくつかあるかと思いますが、例えばcurlにて以下のように取得可能となります。
$ curl -LO http://ftp.jp.debian.org/debian/pool/main/c/curl/curl_7.74.0-1.3+deb11u1_amd64.deb
次にDockerfileの記載になりますが、以下のようにyum localinstallにてインストールが可能となります。
FROM debian:bullseye
COPY ./curl_7.74.0-1.3+deb11u1_amd64.deb /usr/local/install/
RUN apt-get update \
&& apt-get install -y /usr/local/install/curl_7.74.0-1.3+deb11u1_amd64.deb
当記事は以上となります。
Dockerfileを作成する際に、検索してもあまり情報が出てこなかったので今回記事にさせて頂きました。
この方法がベストかは分かりませんが、参考程度になれば幸いです。
長々とお疲れさまでした。