MacOS 환경에서 podman 설치하기 #2
지난 MacOS 환경에서 podman 설치하기 #1에서 Vagrant를 이용한 podman 설치를 했었고 DockerHub에서 컨테이너 Image를 가지고 오지 못해서 좀 더 시간을 두고 확인이 필요하다고 했었다.
그래서, 이번 글에서는 추가적으로 어떤 설정을 해 주어야 하는지 확인 해 보려고 한다.
마지막 Docker Hub의 golang 이미지를 podman으로 내려 받는 명령을 실행했을 때 다음과 같은 메세지가 출력되는 것을 볼 수 있었다.
$ podman pull golang
Error: failed to parse "X-Registry-Auth" header for /v3.3.0/libpod/images/pull?alltags=false&arch=&authfile=&os=&password=&policy=always&quiet=false&reference=golang&username=&variant=: error storing credentials in temporary auth file (server: "https://index.docker.io/v1/", user: ""): key https://index.docker.io/v1/ contains http[s]:// prefix
뭐가 문제일까? 우선은 VM에 접속해서 확인을 해보기로 했다. 다음 명령을 이용하면 Vagrant로 생성하고 실행 중인 VM으로 ssh shell 접속을 할 수 있다.
$ vagrant ssh
뭔가 설정 문제라고 생각되므로 SSH Shell에서 podman pull image를 실행해 보았다. 하지만 VM 상에 실행 중인 podman은 너무나 당연하게 정상적으로 동작했다. 다양한 Container Image Registry가 나타나고 이 중 하나를 선택하면 이미지가 다운로드 받아진다.
$ podman pull golang
✔ docker.io/library/golang:latest
Trying to pull docker.io/library/golang:latest...
Getting image source signatures
Copying blob 4c25b3090c26 done
Copying blob 7b6a93dab1a5 done
Copying blob fcb5bda771c7 done
Copying blob 1acf565088aa done
Copying blob 5cf06daf6561 done
Copying blob b95c0dd0dc0d done
Copying blob a777b06e31ba done
Copying config 21ec38e019 done
Writing manifest to image destination
Storing signatures
21ec38e019696db7d0e4044eb6eb94c642abfa2d344672e10f29f076827d6a18
일반적인 docker와 다른 점이 하나 있다면 위에서 입력한 podman pull golang이라고 입력하면 golang 이미지가 어느 registry인지 확인을 하는 Prompt가 실행되고 사용자는 이를 선택할 수 있게 해 준다.
$ podman pull golang
? Please select an image:
▸ registry.fedoraproject.org/golang:latest
registry.access.redhat.com/golang:latest
docker.io/library/golang:latest
quay.io/golang:latest
그리고, 나중에 다시 이미지를 요청할 때는 해당 정보를 기억하고 alias를 적용해 따로 물어보지 않는다.
$ podman pull golang
Resolved "golang" as an alias (/home/vagrant/.cache/containers/short-name-aliases.conf)
Trying to pull docker.io/library/golang:latest...
Getting image source signatures
Copying blob 4c25b3090c26 [>----------------------------------] 1.6MiB / 52.4MiB
Copying blob b95c0dd0dc0d [==>------------------------------] 942.4KiB / 10.4MiB
Copying blob 5cf06daf6561 [>--------------------------------] 922.4KiB / 52.0MiB
Copying blob 7b6a93dab1a5 [--------------------------------] 814.4KiB / 128.5MiB
Copying blob 1acf565088aa [====>-----------------------------] 786.4KiB / 4.9MiB
Copying blob fcb5bda771c7 [---------------------------------] 702.4KiB / 81.8MiB
/home/vagrant/.cache/containers/short-name-aliases.conf 파일을 확인해보면 다음과 같이 golan에 대한 alias가 적용되어 있는 것을 볼 수 있다.
[aliases]
golang = "docker.io/library/golang"
그럼 VM에서 이미지를 받은 상태에서 MacOS 환경에서 pod images를 실행하면 어떨까?
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
안나온다.. -_-;; 실제 컨테이너 일반적인 검색으로도 해당 오류 메시지는 찾을 수 없는걸 보면 뭔가 내 환경의 문제가 있는 것 같긴하다.
그래서, podman의 코드 저장소에서 해당 에러 메시지를 출력하는 곳을 GitHub를 통해 검색을 해보니 pkg/auth/auth.go:226에 error storing credentials in temporary auth file 이라는 메시지를 찾을 수 있었다.
코드 상으로는 SetAuthentication 함수를 결과가 실패한 상황에서 출력하는 오류 메시지이므로 해당 함수의 내용을 보면 SetCredentials의 실행 결과를 그대로 전달하고 있다.
SetCredentials에서는 CredentialHelper을 이용하여 정보를 저장하는 코드인데 이즘에서 podman이 registry에 접근하는 사용자에 대한 인증 정보를 확인해 볼 필요가 있다.
정상적으로 Image를 가져오는 Fedora VM의 podman과 오류를 발생 시키는 MacOS에서 실행한 결과를 비교해 보면 다음과 같다.
$ podman login -v
Username:
Password:
Used: /run/user/1000/containers/auth.json
Login Succeeded!
$ podman login -v
Error: no registries found in registries.conf, a registry must be provided
두 개의 podman은 같은 버젼을 사용하고 있는데 메세지가 서로 다른 것을 보면 분명 환경적인 문제로 보인다. 우선 MacOS의 podman은 구체적으로 registries.conf를 요청하고 있는데 이에 대한 부분을 코드로 확인해 보았다.
문서상으로는 podman login 시 registry를 지정하지 않는 경우 registries.conf 파일에 있는 목록에서 조회한다고 되어 있다. Fedora VM에서는 /etc/containers/registries.conf 에 있는 것을 확인 했지만 MacOS에는 해당 파일을 찾을 수 없었다. 파일에 별 다른 내용은 없으므로 podman에 docker.io 를 registry로 사용해서 실행해 보았다.
$ podman login -v docker.io
Username:
Password:
Used: /Users/<USERNAME>/.config/containers/auth.json
Login Succeeded!
auth.json 정보가 .config /containers/auth.json에 생성되는 것을 볼 수 있다. 생성된 정보는 VM과 유사하다. 이 상태에서 podman pull에 대해 다시 시도해 보았다.
$ podman pull golang
Error: failed to parse "X-Registry-Auth" header for /v3.3.0/libpod/images/pull?alltags=false&arch=&authfile=&os=&password=&policy=always&quiet=false&reference=golang&username=&variant=: error storing credentials in temporary auth file (server: "https://index.docker.io/v1/", user: ""): key https://index.docker.io/v1/ contains http[s]:// prefix
그래도 여전히 문제가 발생하고 있다. 근데 이 오류 메시지에서 하나 주목할 만한 점이 있는데 바로 이 부분이다.
key https://index.docker.io/v1/ contains http[s]:// prefix
이 값은 어디서 오는 걸까? podman 문서에 따르면 podman login은 기본으로 인증 정보를 위해 $XDG_RUNTIME_DIR/containers/auth.json 를 사용하는데 만약 없다면 $HOME/.docker/config.json 를 사용한다고 한다.
MacOS에는 XDG_RUNTIME_DIR 환경 변수와 auth.json이 없기 때문에 기존에 설치했던 docker의 config.json 정보를 이용하게 되며, 내 컴퓨터에 저장된 config.json 파일은 다음과 같았다.
{
"auths" : {
"https://index.docker.io/v1/" : {
},
"us.icr.io" : {
},
"registry.ng.bluemix.net" : {
},
"docker.io" : {
}
},
"experimental" : "disabled",
"credsStore" : "desktop"
}
이제 좀 실마리가 풀리는 것 같다. 인증 정보에 key로 사용되는 것은 "auth" 값 아래 있는 object 들의 key로 볼 수 있다. 근데 podman에서는 이를 순차적으로 조회하고 형식에 문제가 있다고 판단되면 API응답으로 Error를 주는 것으로 보인다. 아래 docker.io가 있음에도 불구하고 이런 오류를 발생하고 있어서 이 부분은 미처 생각하지 못했었다.
아래와 같이 https://index.docker.io/v1/ 부분을 삭제하고
{
"auths" : {
"us.icr.io" : {
},
"registry.ng.bluemix.net" : {
},
"docker.io" : {
}
},
"experimental" : "disabled",
"credsStore" : "desktop"
}
pull image 실행하면 정상적으로 docker.io에서 golang 이미지를 받아 오는 것을 확인 할 수 있었다.
$ podman pull docker.io/golang
Trying to pull docker.io/library/golang:latest...
Getting image source signatures
Copying blob sha256:7b6a93dab1a5a04a808d066dec615d86c6fbca1b0054f272a90088e3f10d0585
Copying blob sha256:4c25b3090c2685271afcffc2a4db73f15ab11a0124bfcde6085c934a4e6f4a51
Copying blob sha256:1acf565088aae3ef2159885f29853bce88eb16082b0c98fcacd08fc9008c84b9
Copying blob sha256:b95c0dd0dc0d3d367cc5b85f86d8881afb658e8eb341a86daf3835c2f14159ac
Copying blob sha256:5cf06daf65610482c638dcc63479a8281e667e37f7842219d66f2dedf63718f4
Copying blob sha256:fcb5bda771c711b3f665477f16cf36b5d133fac6bfdadc1d1a7bb73b7ec2a45d
Copying blob sha256:7b6a93dab1a5a04a808d066dec615d86c6fbca1b0054f272a90088e3f10d0585
Copying blob sha256:4c25b3090c2685271afcffc2a4db73f15ab11a0124bfcde6085c934a4e6f4a51
Copying blob sha256:fcb5bda771c711b3f665477f16cf36b5d133fac6bfdadc1d1a7bb73b7ec2a45d
Copying blob sha256:1acf565088aae3ef2159885f29853bce88eb16082b0c98fcacd08fc9008c84b9
Copying blob sha256:5cf06daf65610482c638dcc63479a8281e667e37f7842219d66f2dedf63718f4
Copying blob sha256:b95c0dd0dc0d3d367cc5b85f86d8881afb658e8eb341a86daf3835c2f14159ac
Copying blob sha256:a777b06e31ba5f17a2a1b4c7d9059fd54a8f00e60c179f869e1b42a80b27fb9a
Copying blob sha256:a777b06e31ba5f17a2a1b4c7d9059fd54a8f00e60c179f869e1b42a80b27fb9a
Copying config sha256:21ec38e019696db7d0e4044eb6eb94c642abfa2d344672e10f29f076827d6a18
Writing manifest to image destination
Storing signatures
21ec38e019696db7d0e4044eb6eb94c642abfa2d344672e10f29f076827d6a18
아래와 같이 https://index.docker.io/v1/ 를 삭제하지 않고 docker.io가 먼저 오도록 순서를 바꾸어 보았지만 순서는 영향을 주지 않았다.이것 때문에 podman코드를 받아 빌드해보고 디버그 메시지도 출력하면서 다양한 시도를 했었는데 결국엔 설정 문제였다. 그나마 해결 되어서 다행이었다.
이제 이걸로 끝났을까 싶었는데 한 가지가 더 남았는데 바로 podman pull docker.io/golang 이 아닌 podman pull docker.io/golang을 실행하면 오류 메시지가 나온다는 것이다.
$ podman pull golang
Error: short-name resolution enforced but cannot prompt without a TTY
이 부분의 원인도 찾았지만 그건 다음 글에서 다루도록 하겠다.