« ^ »

DeadsnakeのPython3.8をUbuntuにインストールする

所要時間: 約 6分

Deadsnakeは古いバージョンのPythonのdebパッケージをPPA上でホスティングしている。そのため、Deadsnakeからパッケージをインストールするには、そのリポジトリを設定する必要がある。公式には登録されていないリポジトリを登録するには add-apt-repositor を使用していたが、このコマンドはどうやら非推奨になったようだ。ではどうするのかというとOpenPGPの公開鍵をダウンロードしておき、その鍵の設定を /etc/apt/sources.list に記述するというものらしい。GnuPGの鍵束に入れる方法でも実現できそうだが、それはどうやら非推奨なようだ。GnuPGの鍵束にその公開鍵を入れその鍵を信頼してしまうと、全体に渡って鍵を信頼してしまう事になるかららしい。それのどこに問題やリスクがあるのかイメージはできなかったが、今回は /etc/apt/keyrings に鍵を置いて /etc/apt/sources.list を編集するという方法を採用する事にした。

今回設定する環境はコンテナ上で行う。通常であればDockerfileに記述する内容だが、▽いろいろと試行錯誤したかったため、起動したコンテナの中に入り環境を構築していく。コンテナを終了し削除してしまうと作業内容は失われてしまう。

docker run -it ubuntu:22.04 bash
コンテナを起動する。
docker run --volume /opt/ng/evogym:/opt/ng/evogym:rw -it ubuntu:22.04 bash
今回はevogymのCIの検証の為に環境を構築する。その場合はvolumeをマウントした方が良い。

ファイルのダウンロードが必要なためcurlを事前にインストールしておく1

apt update
apt install --yes curl
curlをインストールする

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=/etc/apt/keyrings/deadsnake-pub.asc] https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy main
/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の設定方法が変更されていたりしたため、少し戸惑った。


1

Dockerfileに記述する場合、事前に保持しておくか ADD コマンドにURLを指定して直接ダウンロードできるため、curlをインストールする必要はない。どちらが良いか考えてみたけれど、公開鍵は小さいため事前にダウンロードし、ソースコードリポジトリ内に保持しておく方が良いと思う。

2

debの後ろのオプション指定には、他のオプションを渡す事もできるらしい。例えば arch=xxx のようにCPUアーキテクチャを指定できる。この設定値は通常は dpkg --print-architecture で表示できる値を指定する。

3

pythonやpython3という名前でバイナリを作成してしまうと、他のPythonを利用しているコマンドに影響を与えかねない。マイナーバージョンまで付いた名前でファイルが作成されるため、例えばPython3.8とPython3.9をインストースするといった事もできる。そんな事する人いないでしょと思うかもしれないけれど、そんな事はない。複数バージョンのテストをやりたい人はいる。その場合でもコンテナ技術を使えば、複数バージョンを入れる必要はないと思うかもしれない。確かにコンテナを使えば、複数バージョンを入れなくても良いようにも思えるけれど、様々な理由でコンテナ技術を導入できない事はある。何が言いたいかというと、共存できるというのは結構ありがたい。