「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > docker_userid_fixer を使用して Docker コンテナ内のユーザー ID を修正するエレガントな方法

docker_userid_fixer を使用して Docker コンテナ内のユーザー ID を修正するエレガントな方法

2024 年 11 月 1 日に公開
ブラウズ:225

an elegant way to fix user IDs in docker containers using docker_userid_fixer

それは何ですか?

これは、Docker ホスト コンピューターと対話する Docker コンテナーを使用する際のかなり技術的な問題に関するもので、一般にコンテナー内でのホスト ファイルシステムの使用に関連します。
これは特に再現可能な研究環境で起こります。
私はその問題への取り組みに役立つオープンソース ユーティリティを開発しました。

実行環境としての docker コンテナ

Docker コンテナの初期および主な使用例: 一部のネットワーク ポートを使用してホスト システムとのみ対話する 自己完結型 アプリケーション。
Web アプリケーションについて考えてみましょう。Docker コンテナには通常、Web サーバーと Web アプリケーションが含まれており、たとえばポート 80 (コンテナ内) で実行されます。次に、コンテナの内部ポート 80 をホスト ポート (8000 など) にバインドすることにより、コンテナがホスト上で実行されます。
その場合、コンテナ化されたアプリとホスト システム間の唯一の対話は、このバインドされたネットワーク ポートを介したものになります。

実行環境としてのコンテナはまったく異なります:

  • アプリケーションをコンテナ化するのではなく、アプリケーション ビルド システムがコンテナ化されます。
    • それはコンパイラ、IDE、ノートブック エンジン、Quarto パブリッシング システムなどです...
  • 目標は次のとおりです:
    • 標準の、インストールと共有が簡単な環境
      • 固定バージョンの R、Python、無数の外部パッケージを備えた複雑なビルド環境を想像してみてください。 すべてを適切なバージョンでインストールすることは、非常に困難で時間のかかる作業となる可能性があります。 すでにインストールされ、事前構成されているすべてのものを含む Docker イメージを共有することで、実際の時間を節約できます。
    • 再現可能な環境を用意する
        これを使用すると、まったく同じ制御環境を使用しているため、一部の分析結果を再現できます
      • バグを簡単に再現することもできます。これがバグ修正の第一歩です
ただし、これらの実行環境を使用するには、それらのコンテナがホスト システム、特にホスト ユーザー ファイルシステムにアクセスできる必要があります。

Dockerコンテナとホストファイルシステム

IDE をコンテナ化したとします。 Rスタジオ。

Rstudio は Docker コンテナ内にインストールされて実行されていますが、プロジェクト フォルダー内のファイルを読み取って編集する必要があります。

そのためには、docker run --volume オプションを使用してプロジェクト フォルダー (ホスト ファイルシステム内) を

バインド マウントします。 これで、Docker コンテナ内からファイルにアクセスできるようになります。

ここでの課題はファイルのアクセス許可です。ホスト ユーザーのユーザー ID

1001 があり、コンテナ内の Rsudio プロセスを所有するユーザーが 0 (root) または 1002 であると仮定します。 ]

コンテナ ユーザーが

root の場合、ファイルの読み取りに問題はありません。 しかし、既存のファイルを編集して新しいファイル (pdf、html など) を作成するとすぐに、これらのファイルはホスト ファイルシステム上のルート
に属します!. つまり、これらは root.
に属しているため、ローカル ホスト ユーザーはそれらを使用したり削除したりできなくなります。

コンテナのユーザー ID が

1002 の場合、Rstudio はファイルの読み取り、編集、または新しいファイルの生成ができない可能性があります。 たとえそれができたとしても、非常に寛容な権限を設定すると、ローカル ホスト ユーザーはそれらを使用できなくなる可能性があります。

もちろん、この問題を解決する総当たりの方法の 1 つは、ホスト コンピューター上と Docker コンテナー内の両方で root で実行することです。これは常に可能であるとは限らず、明らかな重大なセキュリティ上の懸念がいくつか生じます。

ファイル所有者の問題の解決パート 1: docker run --user オプション

ホストのユーザー ID (ここでは

1001) が何になるかを事前に知ることができないため、事前に設定することはできません Docker コンテナ ユーザーのユーザー ID。

docker run は、指定されたユーザー ID擬似 ユーザーを作成できる --user オプションを提供するようになりました。 実行時。たとえば、 docker run --user 1001 ... は、プロセス
で実行される docker コンテナを作成します。 ユーザー ID
1001. のユーザーに属します

それでは、この問題について私たちはまだ何を議論しているのでしょうか?解決してないんですか?

動的に作成されたユーザーに関するいくつかの癖があります:

    これは疑似ユーザーです
  • ホーム ディレクトリ (/home/xxx) がありません
  • /etc/passwd には表示されません
  • 事前に設定することはできません。 bash プロファイル、いくつかの環境変数、アプリケーションのデフォルトなど...
これらの問題を回避することはできますが、退屈でイライラする可能性があります。

私たちが本当に望んでいるのは、Docker コンテナ ユーザーを事前設定し、
実行時... でその userid を動的に変更できるようにすることです。

ファイル所有者の問題の解決パート 2: docker_userid_fixer を入力します

docker_userid_fixer は、先ほど提起したユーザー ID の問題を修正するための

docker エントリポイント として使用することを目的としたオープン ソース ユーティリティです。

これを使用する方法を見てみましょう。これを docker ENTRYPOINT として設定し、使用するユーザーを指定し、その

userid を動的に変更します:

ENTRYPOINT ["/usr/local/bin/docker_userid_fixer","user1"]
ENTRYPOINT ["/usr/local/bin/docker_userid_fixer","user1"]
用語を正確に言いましょう:

  • ターゲット ユーザーは、docker_userid_fixer に要求されたユーザーです。ここでは user1
  • requested ユーザーは、docker run によってプロビジョニングされたユーザー、つまり最初のプロセス (PID 1) を (当初) 所有するユーザーです
コンテナ ランタイムの作成時には、次の 2 つのオプションがあります:

  • requested ユーザー ID が (すでに) target ユーザー ID と一致している場合は、何も変更する必要はありません
  • あるいはそうではありません。たとえば、
  • requested ユーザー ID は 1001target ユーザー ID は 100 です。 次に、docker_userid_fixer は、コンテナのメイン プロセスで直接、ターゲット ユーザー user1 のユーザー ID を 1000 から 1001 に修正します。
実際にはこれで問題は解決します:

    コンテナのユーザーIDを修正する必要がない場合は、通常の方法でdocker runを使用してください(--userオプションなし)
  • または --user オプションを使用すると、要求したユーザー ID でメイン プロセスを実行することに加えて、事前構成されたユーザーが要求したユーザー ID に変更され、コンテナーが意図したユーザーと目的のユーザーで実行されるようになります。ユーザーID。
docker_userid_fixer のセットアップ

セットアップに関する手順はここでご覧いただけます。

しかし、要約すると次のようになります:

  • 小さな実行可能ファイル (17k) をビルドまたはダウンロードします

  • Docker イメージにコピーします

  • setuid root として実行可能にします

  • エントリポイントとして設定します

悲惨な詳細

短いメモをいくつか入れました https://github.com/kforner/docker_userid_fixer#how-it-works

でも、言い換えてみます。

実装の核心は、コンテナ内の docker_userid_fixer 実行可能ファイルの

setuid root です。 ユーザー ID を変更するには root 権限が必要であり、この setuid は
に対してのみその特権実行を有効にします。 docker_userid_fixerプログラム、そしてそれは非常に短期間でした。

必要に応じてユーザー ID が変更されるとすぐに、docker_userid_fixer がメイン プロセスを切り替えます

リクエストされたユーザー (およびユーザー ID) に送信されます。

これらのトピック (Docker、再現可能な研究、R パッケージ開発、アルゴリズム、パフォーマンスの最適化、並列処理など) に興味がある場合は、仕事やビジネスの機会について話し合うために、お気軽に私に連絡してください。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/kforner/an-elegant-way-to-fix-user-ids-in-docker-containers-using-dockeruseridfixer-3c9i 侵害がある場合は、study_golang にご連絡ください。 @163.com 削除
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3