flatpak
、 podman
、 rpm-ostree
などのさまざまなコマンドは、OCIコンテナー内では実際には使用できません。 podman
、使用が制限されているものもありますが、概して、人々はそれらをホスト上で直接実行することを期待しています。
同時に、コマンドラインインターフェイスのユーザーのかなりの割合がツールボックスコンテナ内でほとんどの時間を費やすと予想されます。ツールボックスプロジェクトの目標の1つは、ロックされた状態で可変コンテナを使用することによる認知的負担を軽減することです。 Silverblueのようなダウンで不変のホストOS。 flatpak
やrpm-ostree
ようなコマンドは、そのようなOSとのインターフェースのための重要なツールです。
したがって、ホストとツールボックスシェルを切り替えたり、すべてのコマンドの前にflatpak-spawn --host
などを付けたりするよりも優れたユーザーエクスペリエンスを提供できれば便利です。
最も簡単なオプションは、コンテナ内で実行されているシェルにエイリアスをインストールすることです。 ただし、マニュアルやシェルの完成などは提供されません。
もう1つのオプションは、 flatpak
、 podman
、 rpm-ostree
などのRPMをプリインストールすることです。RPMはfedora-toolbox
ベースイメージにありますが、すべてのコードを削除して残します。マニュアルとシェルの完成のみ。 次に、 toolbox
コマンドは、バインドマウントを介して対応するシムを配置し、ツールボックスコンテナの起動時に呼び出しをホストに転送できます。
これにより、 fedora-toolbox
イメージが無駄なGoバイナリで大きくならないようになり、ホストのtoolbox
パッケージを介してラッパーを更新し続けることができます。 エイリアスよりも明示的なシムを使用する利点の1つは、コマンド呼び出しをホストに転送できないコーナーケースをインターセプトできることです。 たとえば、ホストとコンテナ間で共有されていないパスが含まれている場合があります。 明確なエラーメッセージで失敗することは、あいまいな失敗や奇妙な副作用よりも優れています。
ただし、これらのパッケージの1つがコンテナー内で更新された場合、どうなるかわかりません。 それらはバインドマウントされたシムに干渉しますか? RPMの更新中または更新後に、これらのパッケージから不要なビットを削除できれば便利です。
/usr/libexec/toolbox/bin
を追加し、シェルの起動スクリプトを変更して、最初に$PATH
に挿入すると、劇的に簡単になると思います。
ツールボックス内でpodmanを実行すると、非常に便利です。 私はビルドスクリプトがDockerイメージを呼び出すだけの多くのプロジェクトで作業しており、ツールボックス内でそれらのスクリプトを実行できると非常に便利です。 ただし、ツールボックスではなく、silverblueホストを反映する、ホームディレクトリ外のバインドマウントに関する問題を検出するのが難しい場合があります。
開発フローに役立つもののリストにdocker-compose
を追加します。 データストアを1つか2つ必要とするものへの参入障壁が非常に低いため、オープンソースではなく、かなりの数のWebアプリタイプのものがそれを使用します。
派生ツールボックスFROM registry.fedoraproject.org/f31/fedora-toolbox:31
ます。 この派生ツールボックスでは、 /usr/local/bin/host-runner
host-runner
スクリプトを作成することで、この問題を解決しました。
$ cat /usr/local/bin/host-runner
#!/bin/bash
executable=$(basename $0)
set -x
exec flatpak-spawn --host $executable "$@"
次に、ホストコンテキストで実行したいものすべてに対して、 host-runner
へのシンボリックリンクを作成します。
$ ls -l /usr/local/bin/
total 4
lrwxrwxrwx. 1 root root 13 Jan 28 14:16 chromium-browser -> ./host-runner
-rwxr-xr-x. 1 root root 89 Jan 31 10:39 host-runner
lrwxrwxrwx. 1 root root 13 Jan 29 10:51 podman -> ./host-runner
lrwxrwxrwx. 1 root root 13 Jan 28 12:39 systemctl -> ./host-runner
lrwxrwxrwx. 1 root root 13 Jan 28 12:39 virsh -> ./host-runner
lrwxrwxrwx. 1 root root 13 Jan 28 12:39 virt-install -> ./host-runner
注:ユーザーがホストにプロキシするコマンドのリストは、おそらくユーザーごとに異なるため、一般的な構成方法を作成して、ユーザーに自分で実行させる必要があります。
次に、ツールボックス内から処理を実行しますが、ホストにプロキシされます。 唯一の余分なビットは、実行される実際のコマンドが実行される前にstderrに出力されることです。 例えば:
$ virsh list --all
+ exec flatpak-spawn --host virsh list --all
Id Name State
----------------------------------
43 f31_vanilla-f31 running
47 tester running
- fcos shut off
作成したツールボックスコンテナにこのようなものを提供できます。 私はまだこれを少し磨き上げています。 まだ機能していないことの1つは、ユーザーがホスト上でsudoとしてコマンドを実行したい場合の対処方法です。
これを複製しようとしましたが、新しいイメージを作成するのではなく、 host-runner
を~/.local/bin
ました。そのように怠惰になった結果、
[user<strong i="8">@toolbox</strong> ~] podman ps
+ exec flatpak-spawn --host podman ps
+ exec flatpak-spawn --host podman ps
/var/home/user/.local/bin/podman: line 4: exec: flatpak-spawn: not found
もちろん、 ~/.local/bin
はホストとコンテナのPATHにあるため、host-runnerは~/.local/bin
podmanシンボリックリンクを実行しました。これは、ホストでhost-runnerを実行しましたが、flatpak-spawnは実行されませんでした。そこにインストールされていません。 :wink:の場合、ネストされた再帰がどのように発生するかをあえて考えません。
とにかく変更して解決しました
executable=$(basename $0)
からexecutable=/usr/bin/$(basename $0)
、今のところ十分に機能します。
編集:これは他のいくつかの問題を引き起こします。 たとえば、ホストのtoolbox
は、 ~/.local/bin/podman
を呼び出そうとするため、機能しなくなります。 今のところ私の解決策は、ツールボックスコンテナのPATHにのみ追加する別のbinパスを用意することです。
flatpak-spawn --host
を使用するのはクールなトリックです! これは、 ~/.local/bin
、誤ってコマンドを直接実行した場合に無限ループを回避する、純粋なsh *バージョンです。
#!/bin/sh
set -o errexit
set -o nounset
executable="$(basename "$0")"
if [ "$(basename "$(realpath "$0")")" = "${executable}" ]; then
echo "can't run ${executable} via ${executable}" >&2
exit 1
fi
# This seems like the best way to detect if we're inside a toolbox container.
if [ -n "${TOOLBOX_PATH:-}" ]; then
set -x
exec flatpak-spawn --host "${executable}" "$@"
fi
# Otherwise do a little dance to find the executable that would have run if not
# for $0 being on the path, and run that instead.
executable="$(
# Remove this script's directory from PATH; this assumes that you'll never want
# to run a sibling via this script.
dir="$(dirname "$0")"
PATH="$(echo "${PATH}" | sed "s+:${dir}:++")"
PATH="$(echo "${PATH}" | sed "s+${dir}:++")"
PATH="$(echo "${PATH}" | sed "s+:${dir}++")"
command -v "${executable}"
)"
exec "${executable}" "$@"
(これは、奇妙なネストされた実行ケースではテストされていませんが、機能するはずです。)
* realpath
が利用可能であると想定
別のオプションは、コンテナ内のpodmanが常に--remote
使用するようにすることです。 APIサーバーのソケットは、ツールボックスコンテナ内に表示されているように見えます。
最も参考になるコメント
派生ツールボックス
FROM registry.fedoraproject.org/f31/fedora-toolbox:31
ます。 この派生ツールボックスでは、/usr/local/bin/host-runner
host-runner
スクリプトを作成することで、この問題を解決しました。次に、ホストコンテキストで実行したいものすべてに対して、
host-runner
へのシンボリックリンクを作成します。注:ユーザーがホストにプロキシするコマンドのリストは、おそらくユーザーごとに異なるため、一般的な構成方法を作成して、ユーザーに自分で実行させる必要があります。
次に、ツールボックス内から処理を実行しますが、ホストにプロキシされます。 唯一の余分なビットは、実行される実際のコマンドが実行される前にstderrに出力されることです。 例えば:
作成したツールボックスコンテナにこのようなものを提供できます。 私はまだこれを少し磨き上げています。 まだ機能していないことの1つは、ユーザーがホスト上でsudoとしてコマンドを実行したい場合の対処方法です。