【Dockerfile】外部モジュールのインストール方法まとめ

こんにちは。Я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>`

これは外部モジュールをインストールする際に、バージョン指定した方が良いですよ、という警告になります。

MEMO

hadolintによるエラーについては以下のサイトを参考に対応を検討することになる思います。

Haskell Dockerfile Linter:

https://hub.docker.com/r/hadolint/hadolint

もちろん、意図的にバージョン指定していない場合は無視(あるいは警告を非表示にもできます)すればよいのですが、

バージョンを明示したい場合も多いと思います。

しかし、いざバージョン指定しようと思っても、ほとんど情報が出ておらず戸惑う方も多いはずです。

そこで、バージョン指定する際の指定方法や調べ方について備忘がてら記事にしようと思います。

インストールコマンド

今回、インストールに利用するコマンドは以下となります。

redhat系:Cent OS

yum install -y <package>-<version>

debian系:Debian

apt-get install <package>=<version>
※ aptを使えばよいのか、apt-getを使えば良いのか迷うかも知れませんが、Dockerfileではapt-getが正解となります。試しにaptでDockerfileを記載してhadolint先生にご指摘を乞うと以下のように警告を出してくれました。どうやら、aptはエンドユーザ向けのツールだそうです。
$ 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
例:curlのインストール
(後で気づきましたが、Cent OSの公式イメージに元からcurl入ってますね orz)
ディストリビューション毎に、また、アーキテクチャ毎に表示されるので確認できます。
(以下の例だと「curl-7.61.1-22.el8.x86_64」がバージョンになります)
Dockerfile
FROM centos:latest

RUN yum update -y && yum install -y curl-7.61.1-22.el8.x86_64

debian系:Debian

まずは以下のサイトの画面右上の検索窓にてインストールしたい対象を入力して検索して下さい。
Debian パッケージ検索
以下のように確認が可能となります。
Dockerfile
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を作成する際に、検索してもあまり情報が出てこなかったので今回記事にさせて頂きました。

この方法がベストかは分かりませんが、参考程度になれば幸いです。

長々とお疲れさまでした。

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA