システム全体の Docker ログイン?

システム全体の Docker ログイン?

マシン全体または Docker デーモンをレジストリに記録する方法はありますか?

docker login やさまざまな独自の認証情報ヘルパーについて私が目にするものはすべて~/.docker/config.json、つまりユーザーごとに を使用します。

プライベート レジストリからイメージをプルしたい状況があります。複数のユーザーがそれらのマシンに対して任意の sudo アクセス権を持ち、レジストリに対して Docker を使用できる必要があります。

いずれにしても、Docker アクセスはマシンへのルート アクセスとして読み取られる必要があるため (つまり、Docker を実行できる場合、ユーザー資格情報は相互に安全ではありません)、sudo アクセスは同じですが直接的なので、すべてのユーザーが面倒な手続きを踏まなくても、本題に入り、マシン全体をログインさせたいと思います。

誰もが自分の にリンクできる 1 つのファイルを提供することもできますconfig.jsonが、各マシンの最初のログインから処理されるようにした方がよいでしょう。

答え1

3つの選択肢が思い浮かびます:

  1. イメージを非公開にせず、レジストリ サーバーにアクセスできるすべてのユーザーがイメージをプルできるようにします。これは環境ではよくあることです。イメージには、実行時に挿入されたりボリュームに保存されたりする構成ファイル、シークレット、データではなく、アプリケーションを実行するためのライブラリとバイナリのみが含まれている必要があるためです。

  2. 全員がsudoアクセスを持っている場合は、ログインを含むdockerコマンドをsudoから実行します。資格情報はルートユーザーの~/.docker/config.json

  3. ホストにログイン情報を出力するだけの独自の認証情報ヘルパーを作成します。認証情報ヘルパーのインターフェースは非常にシンプルで、シェル スクリプトで実装できる 4 つの操作 (保存、取得、一覧表示、消去) です。ログインの場合、おそらく取得操作のみが必要になります。

この資格情報ヘルパー スクリプトは、次のようなスクリプトになりますdocker-credential-your-helper(your-helper名前は任意です)。

#!/bin/sh

your_registry='
{ "ServerURL": "your-registry",
  "Username": "your-user",
  "Secret": "your-pass"
}
'

if [ "$1" = "get" ]; then
  read hostname
  case "$hostname" in
    your-registry)
      echo "${your_registry}"
      exit 0
      ;;
  esac
elif [ "$1" = "list" ]; then
  echo "your-registry"
fi
# everything else is unhandled
exit 1

そのファイルを実行可能にして、パスに配置します。すると、すべてのユーザーに~/.docker/config.json資格情報ヘルパー エントリが設定されます (docker-credential-このファイルには含まれず、ファイル名のその後の部分のみが含まれることに注意してください)。

{
  "credHelpers": {
    "your-host": "your-helper"
  }
}

関連情報