flatpak を使って python application をパッケージングしてみる試み
flatpak って?
Linux 方面の最近の流れとして、デスクトップアプリケーションとかもコンテナ技術でパッケージング・動作させようぜ、というのがあり、その一つ。 xdg-app と呼ばれていたもの。
デスクトップアプリケーション向けなので、 docker と違って一般ユーザーで普通に実行できたりとか、 X/Wayland とやり取りできたりとか、その他色々ある。
出てくる用語としては、
application
アプリケーション
実行ファイルと、必要があればその依存ライブラリなどがパッケージングされている
実行時は
/app
以下に mount される
runtime
複数の application から参照される共通のシステムイメージ部分
実行時は
/usr
以下に mount される
sdk
runtime + ビルドに必要なモノ
コンパイラとかヘッダファイルとかが入っている
アプリケーションをパッケージングするときはこちらのイメージを使ってビルドを通し、 実行時は runtime を使ってディスク容量を節約する、という使い分けがされる (多分)
repository
application や runtime が置かれてるトコ
辺り。
使い方としては、まず repository を登録し、次に repository から application をインストールし、そして実行する。 という感じ。
パッケージングしてみる
さて、パッケージングしてみる。
パッケージング対象はとりあえず何でもいいのだけど、 python 製のアプリケーションでたまに名前を聞くものとして、 httpie にしよう。
まずは runtime/sdk として何を利用するかだが、 GNOME な人々が配っている org.freedesktop.BasePlatform
に python も含まれているので、コレを使おう。
$ flatpak --user remote-add --if-not-exists gnome https://sdk.gnome.org/gnome.flatpakrepo
$ flatpak --user install gnome org.freedesktop.BasePlatform
Installing: org.freedesktop.BasePlatform/x86_64/1.4 from gnome
6 delta parts, 64 loose fetched; 56494 KiB transferred in 20 seconds
$ flatpak --user install gnome org.freedesktop.BaseSdk
Installing: org.freedesktop.BaseSdk/x86_64/1.4 from gnome
11 delta parts, 21 loose fetched; 98421 KiB transferred in 23 seconds
続いて実際のパッケージング作業。
ここでは flatpak builder
という、設定ファイルから全部いい感じにやってくれるツールが存在するのだが、 今の所 autotools
やら cmake
やら前提になっていて、 python
アプリケーションのパッケージングには使えない。 ということで、諸々手動でやる。
流れとしては、
flatpak build-init
で、簡単な雛形ディレクトリを作成し、flatpak build
で、その雛形 + runtime/sdk 内に入ってコマンドを実行、インストール作業を行い、flatpak build-finish
でメタデータの設定やらを行って、flatpak build-export
で repository に書き出し。
という感じ。
今回はコレを shell script にまとめました。
build-httpie.bash
:
#!/bin/bash REPOSITORY="${HOME}/repos/flatpak/u7fa9.org" PACKAGE="httpie" VERSION="0.9.9" BUILD_FINISH_ARGS=( --share=network --command=http ) _APP="org.u7fa9.${PACKAGE}" _RUNTIME="org.freedesktop.BasePlatform" _SDK="org.freedesktop.BaseSdk" _RUNTIME_VERSION="1.4" build_location="$(mktemp -d "${_APP}".XXXXXXX)" flatpak build-init "${build_location}" "${_APP}" "${_SDK}" "${_RUNTIME}" "${_RUNTIME_VERSION}" # 先述したように、 application は /app 以下に mount されるので、この中に必要なものを全て入れる必要がある。 # 今回は /app 以下に virtualenv を作成し、 httpie を pip install する。 flatpak build "${build_location}" python3 -m venv /app flatpak build --share=network "${build_location}" /app/bin/pip install "${PACKAGE}==${VERSION}" flatpak build-finish "${BUILD_FINISH_ARGS[@]}" "${build_location}" flatpak build-export "${REPOSITORY}" "${build_location}" "${VERSION}"
$ bash build-httpie.bash
You are using pip version 6.0.8, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting httpie==0.9.9
Using cached httpie-0.9.9-py2.py3-none-any.whl
Collecting Pygments>=2.1.3 (from httpie==0.9.9)
Using cached Pygments-2.2.0-py2.py3-none-any.whl
Collecting requests>=2.11.0 (from httpie==0.9.9)
Using cached requests-2.13.0-py2.py3-none-any.whl
Installing collected packages: requests, Pygments, httpie
Successfully installed Pygments-2.2.0 httpie-0.9.9 requests-2.13.0
Please review the exported files and the metadata
Commit: 5c202dac8309b51af168f71c70a92ea564b536f67a5e50f5b6181c6b7a5f4f39
Metadata Total: 277
Metadata Written: 139
Content Total: 1324
Content Written: 1262
Content Bytes Written: 16052289 (16.1 MB)
できあがり。
公開する
Repository を HTTP でアクセスできるどこかにコピーして置くだけ。
https://u7fa9.org/flatpak/repo/
インストールする
別環境にて。 gnome と上記の repository を追加して、インストールする。
$ flatpak --user remote-add --if-not-exists gnome https://sdk.gnome.org/gnome.flatpakrepo
$ flatpak --user remote-add --no-gpg-verify u7fa9 https://u7fa9.org/flatpak/repo/
$ flatpak --user install u7fa9 org.u7fa9.httpie
Required runtime for org.u7fa9.httpie/x86_64/0.9.9 (org.freedesktop.BasePlatform/x86_64/1.4) is not installed, searching...
Found in remote gnome, do you want to install it? [y/n]: y
Installing: org.freedesktop.BasePlatform/x86_64/1.4 from gnome
6 delta parts, 64 loose fetched; 56494 KiB transferred in 20 seconds
Installing: org.u7fa9.httpie/x86_64/0.9.9 from u7fa9
139 metadata, 1261 content objects fetched; 5783 KiB transferred in 2 seconds
実行する
$ flatpak run org.u7fa9.httpie https://u7fa9.org/
HTTP/1.1 200 OK
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 337
Content-Type: text/html; charset=utf-8
Date: Mon, 06 Feb 2017 11:34:21 GMT
ETag: "4ce914bc-151"
Last-Modified: Sun, 21 Nov 2010 12:46:52 GMT
Server: nginx
<html>
<head>
<title>index</title>
<link rel="stylesheet" href="/static/style.css" type="text/css">
</head>
<body>
<ul>
<li><a href="/memo/">memo</a></li>
<li><a href="http://github.com/nakamuray">github</a></li>
<li><a href="http://twitter.com/nakamuray">twitter</a></li>
</ul>
</body>
</html>
動いた。