Toolbox: ツールボックスコンテナ内で、ホスト上でのみ実行できる既知のバイナリにシムを提供します

作成日 2019年04月30日  ·  7コメント  ·  ソース: containers/toolbox

flatpakpodmanrpm-ostreeなどのさまざまなコマンドは、OCIコンテナー内では実際には使用できません。 podman 、使用が制限されているものもありますが、概して、人々はそれらをホスト上で直接実行することを期待しています。

同時に、コマンドラインインターフェイスのユーザーのかなりの割合がツールボックスコンテナ内でほとんどの時間を費やすと予想されます。ツールボックスプロジェクトの目標の1つは、ロックされた状態で可変コンテナを使用することによる認知的負担を軽減することです。 Silverblueのようなダウンで不変のホストOS。 flatpakrpm-ostreeようなコマンドは、そのようなOSとのインターフェースのための重要なツールです。

したがって、ホストとツールボックスシェルを切り替えたり、すべてのコマンドの前にflatpak-spawn --hostなどを付けたりするよりも優れたユーザーエクスペリエンスを提供できれば便利です。

最も簡単なオプションは、コンテナ内で実行されているシェルにエイリアスをインストールすることです。 ただし、マニュアルやシェルの完成などは提供されません。

もう1つのオプションは、 flatpakpodmanrpm-ostreeなどのRPMをプリインストールすることです。RPMはfedora-toolboxベースイメージにありますが、すべてのコードを削除して残します。マニュアルとシェルの完成のみ。 次に、 toolboxコマンドは、バインドマウントを介して対応するシムを配置し、ツールボックスコンテナの起動時に呼び出しをホストに転送できます。

これにより、 fedora-toolboxイメージが無駄なGoバイナリで大きくならないようになり、ホストのtoolboxパッケージを介してラッパーを更新し続けることができます。 エイリアスよりも明示的なシムを使用する利点の1つは、コマンド呼び出しをホストに転送できないコーナーケースをインターセプトできることです。 たとえば、ホストとコンテナ間で共有されていないパスが含まれている場合があります。 明確なエラーメッセージで失敗することは、あいまいな失敗や奇妙な副作用よりも優れています。

ただし、これらのパッケージの1つがコンテナー内で更新された場合、どうなるかわかりません。 それらはバインドマウントされたシムに干渉しますか? RPMの更新中または更新後に、これらのパッケージから不要なビットを削除できれば便利です。

1. Feature request 2. Container Realm 5. Help Wanted Project Pickle 🥒

最も参考になるコメント

派生ツールボックス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としてコマンドを実行したい場合の対処方法です。

全てのコメント7件

/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サーバーのソケットは、ツールボックスコンテナ内に表示されているように見えます。

このページは役に立ちましたか?
0 / 5 - 0 評価