๊ธฐ์
10 ๊ฐ ์ด์์ ์ด๋ฏธ์ง๊ฐ์๋ ๊ฒฝ์ฐ docker hub์์ docker private repository๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋์ปค ํ๋ธ์์ ๋น๋ ๋ ์ด๋ฏธ์ง์ ํ์ฌ ์ ์๋ ์ด๋ฏธ์ง๋ฅผ ๋น๊ตํ ์ ์๋๋ก ๋์ปค ํ๋ธ์์ ๋์ปค ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ์ป๊ณ ์ถ์ต๋๋ค.
Google์์ ์ฐพ์ ๋ช ๋ น์ ์คํํ์ฌ ์ธ์ฆ ํ ํฐ์ ์ป๊ธฐ ์ํด curl์ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ณด์ ๋๋ค.
UNAME="exampleuser"
UPASS="examplepass"
PRODUCT="examplecompany"
REPOSITORY="$PRODUCT"
SERVICE="exampleservice"
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํ ํฐ์ ์ป์ผ๋ ค๊ณ ํฉ๋๋ค.
TOKEN=$(curl -u $UNAME:$UPASS "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:pull&account=$UNAME" | jq -r .token)
TOKEN=$(curl -u $UNAME:$UPASS "https://auth.docker.io/token?service=index.docker.io&scope=repository:$REPOSITORY:pull&account=$UNAME" | jq -r .token)
TOKEN=$(curl -u $UNAME:$UPASS "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:pull&account=$UNAME&offline_token=true" | jq -r .token)
TOKEN=$(curl -u $UNAME:$UPASS "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:$SERVICE:pull&account=$UNAME&offline_token=true" | jq -r .token)
TOKEN=$(curl -u $UNAME:$UPASS "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:$SERVICE&account=$UNAME&offline_token=true" | jq -r .token)
๋ชจ๋ ๊ฒฝ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ธ ์ ์ฅ์์์ ๋งค๋ํ์คํธ๋ฅผ ์ป์ผ๋ ค๊ณ ์๋ํ๋ ํ ํฐ์ ์ป์ต๋๋ค.
1.
REPO="$PRODUCT/$SERVICE"
TAG=latest
REGISTRY=https://registry-1.docker.io/v2
URI="$REGISTRY/$REPO/manifests/$TAG"
echo URI=$URI
MANIFEST="`curl -skL -o /dev/null -D- $URI`"
CHALLENGE="`grep "Www-Authenticate" <<<"$MANIFEST"`"
if [[ CHALLENGE ]]; then
IFS=\" read _ REALM _ SERVICE _ SCOPE _ <<<"$CHALLENGE"
echo REALM is $REALM
echo SERVICE is $SERVICE
echo SCOPE is $SCOPE
TOKEN="`curl -skL "$REALM?service=$SERVICE&scope=$SCOPE"`"
IFS=\" read _ _ _ TOKEN _ <<<"$TOKEN"
echo TOKEN is $TOKEN
MANIFEST="`curl -isk -X GET -H "Authorization: Bearer $TOKEN" $URI`"
echo "RESPONSE is $MANIFEST"
fi
2.
curl -s -D - -H "Authorization: Bearer ${TOKEN}" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://index.docker.io/v2/repositories/$PRODUCT/$SERVICE/manifests/latest
ํญ์ ์ป์
RESPONSE is HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="examplecompany/exampleservice:pull",error="insufficient_scope"
Date: Wed, 15 Mar 2017 16:15:52 GMT
Content-Length: 155
Strict-Transport-Security: max-age=31536000
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"examplecompany/exampleservice","Action":"pull"}]}]}
๋์ปค ํ๋ธ์์ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
๋ค์์ ํตํด ํ๊ทธ๋ฅผ ์ป์ผ๋ ค๊ณ ํ ๋
REPO_LIST=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${PRODUCT}/?page_size=10000 | jq -r '.results|.[]|.name')
๋๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ํ ๋ด๊ฐ ์ํ๋ ์ผ์ ํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ฅผ ์ฌํํ๋ ๋จ๊ณ :
๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ช ํ์ญ์์ค.
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"examplecompany/exampleservice","Action":"pull"}]}]}
์์ ํ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ช ํ์ญ์์ค.
ํ์ฌ ๋์ปค ํ๋ธ ์ด๋ฏธ์ง์ ํ์๋ ์ ๋ณด๊ฐ ํฌํจ ๋ Json์ ๋๋ค.
https://github.com/docker/docker/issues/29257#issuecomment -266121974์ ๋ํ ํ ๋ก ์ ์๋ง๋ ์ฌ๊ธฐ์ ๊ด๋ จ์ด์์ ๊ฒ์ ๋๋ค.
์๋
ํ์ธ์ @westsouthnight ,์ด ์คํฌ๋ฆฝํธ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค : https://gist.github.com/cirocosta/fb6b90cb7651ff21eda4838a73e3710b .
ํ ํฐ์ ๊ฒ์ ํ ๋ ๊ธฐ๋ณธ ์ธ์ฆ์ ์ํํ๋ ๋ฐ -u
์ ์ฌ์ฉํ์ง ์์ง๋ง ๊ฐ์ธ ์ ์ฅ์๋ก ํ
์คํธํ๊ณ get_token() {
-u
๋ฅผ ์ถ๊ฐํ๋ฉด ์ค์ ๋ก ์๋ํฉ๋๋ค. ๊ฐ์ธ ๋ ์ง์คํธ๋ฆฌ ์ฌ์ฉ -u
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๊ฒ์ ํ ์ ์์ต๋๋ค.
curl \
-u user:pass \
--silent \
"https://auth.docker.io/token?scope=repository:$image:pull&service=registry.docker.io" \
| jq -r '.token'
๋์์ด๋๋์ง ์๋ ค์ฃผ์ธ์ ๐
GitHub ๋ฌธ์ ์ถ์ ๊ธฐ๋ ์ค์ ๋ก ์ผ๋ฐ ์ง์ ํฌ๋ผ์ด ์๋๋ฏ๋ก์ด ๋ฌธ์ ๋ฅผ ๋ซ๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ฒ๊ทธ ๋ฐ ๊ธฐ๋ฅ ์์ฒญ์๋ณด๊ณ ํฉ๋๋ค. ๋ค๋ฅธ ์ ํ์ ์ง๋ฌธ์ ๋ํด์๋ ๋ค์ ์ค ํ๋๋ฅผ ์ฌ์ฉํด๋ณด์ญ์์ค.
์ด ์ง๋ฌธ์์ด ๋ฆฌํฌ์งํ ๋ฆฌ์ ์์ค ์ฝ๋์ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์์ง๋ง Docker Hub (๋ฐ ์ฌ๊ธฐ์์ ์ฌ์ฉ๋๋ ์ธ์ฆ)์ ๊ด๋ จ์ด ์์ต๋๋ค. ํ์ง๋ง ์์ ๋กญ๊ฒ ๋ํ๋ฅผ ๊ณ์ํ์ธ์ ๐