dockerが既にdockerレジストリサーバーにログインしているかどうかを確認する方法


116

cmd:docker loginを使用してcmd行のdockerレジストリにすでにログインしているかどうかはわかりません。プッシュしようとせずに、ログインしているかどうかをどのようにテストまたは確認できますか?


あなたの質問が理解できませんか?端末にログインしているかどうかを知りたいですか?ターミナルで%docker imagesコマンドを実行して、画像が表示されるかどうかを確認しませんか?
noobuntu 2016年

1
端末のdockerhubレジストリにログインしているかどうかを知りたい。画像はローカルだと思ったので、Dockerhub画像ではなく、ローカル画像のみが表示されます。
Ville Miekk-oja 2016年

1
dockerにログインすると、dockerhubレジストリに接続されると思います。別のログインがあるとは思いません
noobuntu

回答:


64

2020年を編集

指摘されている(クローズされたgithubの問題を再度参照すると、実際のセッションや状態はありません。

docker loginは実際には永続的なセッションを作成していません。ユーザーの資格情報をディスクに保存しているだけなので、認証が必要な場合は、それらを読み取ってログインできます。

他の人が指摘したように、ログインに成功すると、authsエントリ/ノードが~/.docker/config.jsonファイルに追加されます(これはプライベートレジストリでも機能します)。

{
    "auths": {
            "https://index.docker.io/v1/": {}
    },
    ...

ログアウトすると、このエントリは削除されます。

$ docker logout
Removing login credentials for https://index.docker.io/v1/

config.json後のドッカーの内容:

{
    "auths": {},
    ...

このファイルをスクリプトまたはコードで解析して、ログインステータスを確認できます。

代替方法(再ログイン)

あなたはドッカーにログインすることができます docker login <repository>

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If 
you don't have a Docker ID, head over to https://hub.docker.com to 
create one.
Username:

すでにログインしている場合、プロンプトは次のようになります。

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If 
you don't have a Docker ID, head over to https://hub.docker.com to 
create one.
Username (myusername):        # <-- "myusername"

の元の説明については~/.docker/config.json質問を確認してください:プライベートDockerレジストリにログインしているかどうかはどうすればわかりますか


4
最後のリンクは、の内容の確認について述べてい~/.docker/config.jsonます。
dusan 2017年

2
docker infoindex.docker.ioでも、信頼性が低いようです。現在ログインしており、Registryエントリのみが表示されていUsernameます。
有名なガーキン

3
Docker情報にユーザー名が表示されなくなりました。私はWindowsで、Dockerバージョン18.05.0-ceを使用しています。
Giovanni Bassi

3
スクリプトがチェックする必要がある場合はどうなりますか?
Teekin 2018

これはメインのDockerハブでのみ機能すると思います。他のリポジトリへの認証には、config.jsonファイルを確認する必要があります。
duane

43

このチェックには、次の2つの方法のいずれかを使用します。

1:config.jsonファイルを表示します。

「private.registry.com」にログインしている場合は、次のように同じエントリが表示されます~/.docker/config.json

"auths": {
    "private.registry.com": {
        "auth": "gibberishgibberishgibberishgibberishgibberishgibberish"
    }
 }

2:docker loginをもう一度試してください:

private.registry.comとのアクティブなセッションがすでにあるかどうかを確認する場合は、もう一度ログインしてみてください。

bash$ docker login private.registry.com
Username (logged-in-user):

上記のような出力が表示された場合logged-in-userは、とのアクティブなセッションがすでにあったことを意味しprivate.registry.comます。代わりにユーザー名の入力を求められただけの場合は、アクティブなセッションがないことを示しています。


13

次のコマンドを実行して、ログインに使用しているユーザー名と使用されているレジストリを確認できます。

docker system info | grep -E 'Username|Registry'

6

ここまでの答えはあまり役に立ちません:

  • docker info この情報を提供しなくなりました
  • docker logout 重大な不便です-資格情報をすでに知っていて、簡単に再ログインできない場合
  • docker login 応答は非常に信頼性が低く、プログラムで解析するのが簡単ではないようです

私のために働いた私の解決策は、@ noobuntuのコメントに基づいています。プルしたいイメージがすでにわかっている場合は、ユーザーがすでにログインしているかどうかわからないので、これを行うことができます。

try pulling target image
-> on failure:
   try logging in
   -> on failure: throw CannotLogInException
   -> on success:
      try pulling target image
      -> on failure: throw CannotPullImageException
      -> on success: (continue)
-> on success: (continue)

これは断然最高の戦略です。プルを試してみて、失敗した場合はログインしません(残りのロジックは各ユースケースに依存しますが、最初の試行は普遍的に適用されます)。
オリバー

2
しかし、誰かがgithub.com/moby/moby/issues/15466で、ログインの問題だけでなく、失敗には多くの理由があると指摘しましたが、Dockerの終了ステータスでは失敗の理由を区別できません。それでも他のソリューションよりは優れていますが、完全なソリューションにはdockerへのパッチが必要です。
オリバー

5

プライベートレジストリの場合、何も表示されませんdocker info。ただし、logoutコマンドは、ログインしているかどうかを通知します。

 $ docker logout private.example.com
 Not logged in to private.example.com

(これにより、再度ログインする必要があります。)


5

docker cliクレデンシャルスキームは驚くほど複雑ではありません。

cat ~/.docker/config.json

{
  "auths": {
    "dockerregistry.myregistry.com": {},
    "https://index.docker.io/v1/": {}

これはWindowsに存在し(を使用Get-Content ~\.docker\config.json)、ユーザー名も一覧表示する認証ツールをざっと見ることもできます...そして、パスワードを取得することもできると思います

. "C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe" list

{"https://index.docker.io/v1/":"kcd"}

あなただけのユーザー名を見ることができますWindowsの場合、パスワードは資格情報マネージャ(コントロールパネル)に保存されている
するThorbjörnRavnアンデルセン

私は驚きを台無しにすると思います... docker-credential-wincred.exe <store|get|erase|list|version>それはあなたがgetあなたのパスワードをできることを意味します
KCD

そのcatコマンドはLinuxパス区切り文字を使用する必要があります:cat〜/ .docker / config.json。これは一部の人には一見のところ一見のように思われるかもしれませんが、他の読者はそれをコピーして貼り付けて試してみるだけで、「そのようなファイルまたはディレクトリがない」エラーが原因であることにすぐには気付かないかもしれません。:-)
チャーリーアハート

@charliearehartあなたは私の怠惰を過小評価しています、私はPowershellでcatエイリアスを使用していました...両方を含むように更新されました
KCD

@KCD、ああ。:-)明確にしていただきありがとうございます。
チャーリーアハート

4

チェックしたところ、今日は次のようになります。

$ docker login
Authenticating with existing credentials...
Login Succeeded

注:これは、最新バージョンのDocker CE、docker-credential-helperを備えたmacOS上にあります-両方とも自家製です。


3

少なくとも「Docker for Windows」では、UIを介してdocker hubにログインしているかどうかを確認できます。Windowsの通知領域にあるDockerアイコンを右クリックするだけです。 ログインしているDocker


1
GUIなしのDockerバージョンはどうですか?または非ウィンドウ?
Zameer Fouzan

1
次に、他の回答からのアプローチの1つを使用する必要があります。
BaluJr。

2

単純なtrue/false値が必要な場合は、パイプを使用してdocker.jsonに渡すことができますjq

is_logged_in() {
  cat ~/.docker/config.json | jq -r --arg url "${REPOSITORY_URL}" '.auths | has($url)'
}

if [[ "$(is_logged_in)" == "false" ]]; then
  # do stuff, log in
fi

2
あなたは持つことができjq、適切な終了コードを返し、その後、あなたは文字列の比較を行う必要はありません:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
GUSS

いいね!ありがとうございました!
mcw


1

Windowsでは、次のファイルを見て、ログインの「許可」(auths)を検査できます: [USER_HOME_DIR] .docker \ config.json

例: c:\ USERS \ YOUR_USERANME.docker \ config.json

Windows資格情報の場合、次のようになります。

{
"auths": {
    "HOST_NAME_HERE": {},
    "https://index.docker.io/v1/": {}
},
"HttpHeaders": {
    "User-Agent": "Docker-Client/18.09.0 (windows)"
},
"credsStore": "wincred",
"stackOrchestrator": "swarm"
}

0

@Christianが指摘したように、最初に操作を試みてから、必要な場合にのみログインすることをお勧めします。問題は、「必要に応じて」ロバストにするのがそれほど明白ではないことです。1つの方法は、Docker操作のstderrを既知の文字列と(試行錯誤によって)比較することです。例えば、

try "docker OPERATION"
if it failed: 
    capture the stderr of "docker OPERATION"
    if it ends with "no basic auth credentials": 
        try docker login
    else if it ends with "not found":
        fatal error: image name/tag probably incorrect
    else if it ends with <other stuff you care to trap>:
        ...
    else:
        fatal error: unknown cause

try docker OPERATION again
if this fails: you're SOL!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.