cmd:docker loginを使用してcmd行のdockerレジストリにすでにログインしているかどうかはわかりません。プッシュしようとせずに、ログインしているかどうかをどのようにテストまたは確認できますか?
cmd:docker loginを使用してcmd行のdockerレジストリにすでにログインしているかどうかはわかりません。プッシュしようとせずに、ログインしているかどうかをどのようにテストまたは確認できますか?
回答:
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レジストリにログインしているかどうかはどうすればわかりますか
~/.docker/config.json
ます。
docker info
index.docker.ioでも、信頼性が低いようです。現在ログインしており、Registry
エントリのみが表示されていUsername
ます。
このチェックには、次の2つの方法のいずれかを使用します。
「private.registry.com」にログインしている場合は、次のように同じエントリが表示されます~/.docker/config.json
。
"auths": {
"private.registry.com": {
"auth": "gibberishgibberishgibberishgibberishgibberishgibberish"
}
}
private.registry.comとのアクティブなセッションがすでにあるかどうかを確認する場合は、もう一度ログインしてみてください。
bash$ docker login private.registry.com
Username (logged-in-user):
上記のような出力が表示された場合logged-in-user
は、とのアクティブなセッションがすでにあったことを意味しprivate.registry.com
ます。代わりにユーザー名の入力を求められただけの場合は、アクティブなセッションがないことを示しています。
次のコマンドを実行して、ログインに使用しているユーザー名と使用されているレジストリを確認できます。
docker system info | grep -E 'Username|Registry'
ここまでの答えはあまり役に立ちません:
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)
プライベートレジストリの場合、何も表示されませんdocker info
。ただし、logoutコマンドは、ログインしているかどうかを通知します。
$ docker logout private.example.com
Not logged in to private.example.com
(これにより、再度ログインする必要があります。)
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"}
docker-credential-wincred.exe <store|get|erase|list|version>
それはあなたがget
あなたのパスワードをできることを意味します
cat
エイリアスを使用していました...両方を含むように更新されました
少なくとも「Docker for Windows」では、UIを介してdocker hubにログインしているかどうかを確認できます。Windowsの通知領域にあるDockerアイコンを右クリックするだけです。
単純な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
jq
、適切な終了コードを返し、その後、あなたは文字列の比較を行う必要はありません:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
以下のようなコマンドを使用します。
docker info | grep 'name'
WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
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"
}
@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!