Deadsnakeは古いバージョンのPythonのdebパッケージをPPA上でホスティングしている。そのため、Deadsnakeからパッケージをインストールするには、そのリポジトリを設定する必要がある。公式には登録されていないリポジトリを登録するには add-apt-repositor
を使用していたが、このコマンドはどうやら非推奨になったようだ。ではどうするのかというとOpenPGPの公開鍵をダウンロードしておき、その鍵の設定を /etc/apt/sources.list
に記述するというものらしい。GnuPGの鍵束に入れる方法でも実現できそうだが、それはどうやら非推奨なようだ。GnuPGの鍵束にその公開鍵を入れその鍵を信頼してしまうと、全体に渡って鍵を信頼してしまう事になるかららしい。それのどこに問題やリスクがあるのかイメージはできなかったが、今回は /etc/apt/keyrings
に鍵を置いて /etc/apt/sources.list
を編集するという方法を採用する事にした。
今回設定する環境はコンテナ上で行う。通常であればDockerfileに記述する内容だが、▽いろいろと試行錯誤したかったため、起動したコンテナの中に入り環境を構築していく。コンテナを終了し削除してしまうと作業内容は失われてしまう。
ファイルのダウンロードが必要なためcurlを事前にインストールしておく1。
Deadsnakeがビルドしたdebパッケージは、Ubuntuのバージョン毎にhttps://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntuに設置されている。一般的な情報はhttps://launchpad.net/~deadsnakesや、https://github.com/deadsnakesから伺い知る事ができるだろう。
PPAは非公式リポジトリであるため、それを使用するためにはOpenPGPの公開鍵を取得する必要がある。Deadsnakeはその公開鍵をhttps://keyserver.ubuntu.comにアップロードしている。ドメイン名からも推察できるけれど、このサーバはOpenPGPの公開鍵を共有するサーバーで、Deadsnakeの公開鍵も共有されている。
https://launchpad.net/~deadsnakes/+archive/ubuntu/ppaのページには Technical details about this PPA
という箇所があり、そこを開くと /etc/apt/source.list
に記述する設定の例、公開鍵へのリンクと鍵指紋が記載されている。
この公開鍵を、鍵サーバからダウンロードする。
curl 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xF23C5A6CF475977595C89F51BA6932366A755776' -o deadsnake-pub.asc
公開鍵はASCII Armor形式になっている。この鍵を /etc/apt/keyrings
に配置する。
mkdir -p /etc/apt/keyrings
mv deadsnake-pub.asc /etc/apt/keyrings/deadsnake-pub.asc
公開鍵を配置する場所には /etc/apt/keyrings
ディレクトリが推奨されてはいるものの、自動で読み込まれる訳ではないらしい。aptはこのリポジトリでは、この公開鍵を使うといった運用を前提にしているようだ。
非公開リポジトリの設定は /etc/apt/sources.list
に追加するが、合わせてそこに公開鍵の設定も記述する。
debの後ろに [signed-by=公開鍵へのパス]
といった形式でオプションを指定する2。コマンドで挿入する場合、例えば以下のようになる。
echo 'deb [signed-by=/etc/apt/keyrings/deadsnake-pub.asc] https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy main' >> /etc/apt/sources.list
リポジトリの設定ができたら、リポジトリの情報を更新する。
apt update
apt search
で使用するパッケージを探すと、使いたいパッケージの情報を確認できる。
apt search python3.8
今回はpython3.8、python3.8-dev(Pythonのヘッダファイルを使うために必要)、python3.8-distutils(pipをインストールするために必要)、python3.8-venv(venvを使うために必要)を入れる事にした。
apt install --yes python3.8 python3.8-dev python3.8-distutils python3.8-venv
途中でダウンロードするサーバーの地域を聞かれる事がある。どこでもダウンロードは可能だと思うが、今いる地域に一番近い場所を選ぶのが良いだろう(たぶんその方が速い)。私は東京にいるので、Asia、Tokyoを選択した。
インストールが完了すると /usr/bin
配下に、実行可能なファイルが作成される。pythonやpython3というファイル名ではなく、マイナーバージョンまで付いた名前になっている3。
python3.8 -V
この状態ではpipはインストールされていない。以下のコマンドを実行する事でpipをインストールできる。
python3.8 -m ensurepip
python3.X-distutils debパッケージをインストールしないと、このコマンドは失敗する。そのため先程 python3.8-distutils
をインストールした。成功するとpip3.8がインストールされている。
pip3.8 -V
今回はDeadsnakeのPython3.8をUbuntuにインストールする手順を確認した。PPAの設定方法が変更されていたりしたため、少し戸惑った。
Dockerfileに記述する場合、事前に保持しておくか ADD
コマンドにURLを指定して直接ダウンロードできるため、curlをインストールする必要はない。どちらが良いか考えてみたけれど、公開鍵は小さいため事前にダウンロードし、ソースコードリポジトリ内に保持しておく方が良いと思う。
debの後ろのオプション指定には、他のオプションを渡す事もできるらしい。例えば arch=xxx
のようにCPUアーキテクチャを指定できる。この設定値は通常は dpkg --print-architecture
で表示できる値を指定する。
pythonやpython3という名前でバイナリを作成してしまうと、他のPythonを利用しているコマンドに影響を与えかねない。マイナーバージョンまで付いた名前でファイルが作成されるため、例えばPython3.8とPython3.9をインストースするといった事もできる。そんな事する人いないでしょと思うかもしれないけれど、そんな事はない。複数バージョンのテストをやりたい人はいる。その場合でもコンテナ技術を使えば、複数バージョンを入れる必要はないと思うかもしれない。確かにコンテナを使えば、複数バージョンを入れなくても良いようにも思えるけれど、様々な理由でコンテナ技術を導入できない事はある。何が言いたいかというと、共存できるというのは結構ありがたい。