Moby: ๊ฐœ์ธ ์ €์žฅ์†Œ์—์„œ image_id ๋˜๋Š” ๊ธฐํƒ€ ์ •๋ณด๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 03์›” 15์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: moby/moby


๋ฒ„๊ทธ ๋ณด๊ณ ์„œ ์ •๋ณด

๊ธฐ์ˆ 

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')

๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ผ์„ ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„ :

  1. hub.docker.com์— ๋น„๊ณต๊ฐœ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ธ์ฆ ํ† ํฐ ๋ฐ›๊ธฐ
  3. hub.docker.com์—์„œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ •๋ณด ๋˜๋Š” ๊ธฐํƒ€ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ์–ป์œผ์‹ญ์‹œ์˜ค.

๋ฐ›์€ ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.

{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"examplecompany/exampleservice","Action":"pull"}]}]}

์˜ˆ์ƒ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.

ํ˜„์žฌ ๋„์ปค ํ—ˆ๋ธŒ ์ด๋ฏธ์ง€์— ํ‘œ์‹œ๋œ ์ •๋ณด๊ฐ€ ํฌํ•จ ๋œ Json์ž…๋‹ˆ๋‹ค.

aredistribution kinquestion

๋ชจ๋“  3 ๋Œ“๊ธ€

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 (๋ฐ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ธ์ฆ)์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž์œ ๋กญ๊ฒŒ ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•˜์„ธ์š” ๐Ÿ‘

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰