Docker가 이미 Docker 레지스트리 서버에 로그인되어 있는지 확인하는 방법


116

cmd : docker login을 사용하여 cmd 줄의 docker 레지스트리에 이미 로그인했는지 확실하지 않습니다. 푸시하지 않고 로그인 여부를 어떻게 테스트하거나 확인할 수 있습니까?


질문을 이해하지 못 하셨나요? 터미널에 로그인했는지 알고 싶습니까? 터미널에서 % docker images 명령을 실행 하고 이미지가 나타나는지 확인하십시오.
noobuntu

1
터미널에서 dockerhub 레지스트리에 로그인했는지 알고 싶습니다. 이미지가 로컬이라고 생각했기 때문에 dockerhub 이미지가 아닌 로컬 이미지 만 표시됩니다.
Ville Miekk-oja

1
Docker에 로그인하면 dockerhub 레지스트리에 연결됩니다. 나는 별도의 로그인이 생각하지 않는다
noobuntu

답변:


64

2020 편집

지적 ( 닫힌 ) github 문제를 다시 언급하면 실제 세션이나 상태가 없습니다.

도커 로그인은 실제로 어떤 종류의 영구 세션을 생성하지 않으며 사용자의 자격 증명 만 디스크에 저장하므로 인증이 필요할 때 로그인을 위해 읽을 수 있습니다.

다른 사람들이 지적했듯이 성공적으로 로그인 하면 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 확인하십시오 . 개인 도커 레지스트리에 로그인했는지 어떻게 알 수 있습니까?


4
마지막 링크는의 내용 확인에 대해 설명합니다 ~/.docker/config.json.
dusan

2
docker infoindex.docker.io 에서도 분명히 신뢰할 수 없습니다 . 현재 정상적으로 로그인되어 있으며 Registry항목 만 표시 Username됩니다.
famousgarkin

3
도커 정보가 더 이상 사용자 이름을 표시하지 않습니다. Windows에 Docker 버전 18.05.0-ce가 있습니다.
Giovanni Bassi

3
스크립트가 확인해야하는 경우 어떻게합니까?
Teekin

이것은 메인 도커 허브에서만 작동한다고 생각합니다. 다른 저장소에 대한 인증은 config.json 파일을 확인해야합니다.
duane

43

이 검사를 위해 다음 두 가지 방법 중 하나를 사용합니다.

1 : config.json 파일보기 :

"private.registry.com"에 로그인 한 경우 다음과 같은 항목이 표시됩니다 ~/.docker/config.json.

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

2 : 도커 로그인을 다시 시도하십시오.

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)

이것이 가장 좋은 전략입니다. 풀을 시도하고 실패하면 로그인되지 않습니다 (나머지 로직은 각 사용 사례에 따라 다르지만 첫 번째 시도는 보편적으로 적용 가능합니다).
Oliver

2
그러나 누군가 github.com/moby/moby/issues/15466 에서 로그인 문제뿐만 아니라 실패에 대한 많은 이유 가 있다고 지적 했지만 도커 종료 상태는 실패 이유를 구별 할 수 없습니다. 다른 솔루션보다 여전히 낫지 만 전체 솔루션은 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ørn Ravn Andersen

나는 놀라움을 망칠 것 같네요 ... docker-credential-wincred.exe <store|get|erase|list|version>이것은 당신이 get당신의 암호 를 할 수 있다는 것을 의미 합니다
KCD

해당 cat 명령은 Linux 경로 구분 기호를 사용해야합니다 : cat ~ / .docker / config.json. 이것은 어떤 사람들에게는 간단한 선택으로 보일 수 있지만 다른 독자들은 단지 그것을 복사 / 붙여 넣기하고 시도 할 수 있으며 "해당 파일이나 디렉토리가 없음"오류가이 때문이라는 것을 쉽게 깨닫지 못할 수도 있습니다. :-)
charlie arehart

@charliearehart 당신은 내 게으름을 과소 평가합니다. 저는 catPowershell 에서 별칭을 사용했습니다 ... 둘 다 포함하도록 업데이트되었습니다
KCD

@KCD, 아. :-) 명확히 해주셔서 감사합니다.
charlie arehart

4

방금 확인했지만 오늘은 다음과 같습니다.

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

참고 : 이것은 최신 버전의 Docker CE, docker-credential-helper-둘 다 homebrew와 함께 설치된 macOS에 있습니다.


3

적어도 "Docker for Windows"에서는 UI를 통해 도커 허브에 로그인했는지 확인할 수 있습니다. Windows 알림 영역에서 Docker 아이콘을 마우스 오른쪽 버튼으로 클릭하십시오. Docker 로그인


1
GUI가없는 도커 버전은 어떻습니까? 또는 비 Windows?
Zameer Fouzan

1
그런 다음 다른 답변의 접근 방식 중 하나를 사용해야합니다.
BaluJr.

2

간단한을 원하는 경우 true/false값을, 당신은 파이프 당신의 수 docker.jsonjq.

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에서는 [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이 지적했듯이 먼저 작업을 시도한 다음 필요한 경우에만 로그인하는 것이 가장 좋습니다. 문제는 "필요한 경우"가 강력하게 수행하는 것이 분명하지 않다는 것입니다. 한 가지 접근 방식은 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.