HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ˜เจพเจน เจฆเฉ‡ 2 เจฌเฉˆเจ— เจธเจจ, 75 เจฎเฉ‡เจธเจ•เจฒเจฟเจจ เจ—เฉ‹เจฒเฉ€เจ†เจ‚ เจฏเฉ‚เจจเจฟเจ•เจธ เจตเจพเจคเจพเจตเจฐเจฃ, เจ‡เฉฑเจ• เจกเฉŒเจ•เจฐ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเจพ เจ•เฉฐเจฎ เจธเฉ€เฅค

HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจฏเฉ‚เจชเฉ€เจกเฉ€:
เจธเจตเจพเจฒ: เจ‡เจน เจธเจญ เจ•เจพเจนเจฆเฉ‡ เจฒเจˆ เจนเฉˆ?
เจ‰เฉฑเจคเจฐ: เจ‰เจคเจชเจพเจฆ เจฆเฉ€ เจฒเฉ‹เจก เจŸเฉˆเจธเจŸเจฟเฉฐเจ— (เจฌเฉˆเจธเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจพ เจ•เจฐเฉ‹, เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจตเจฟเจฆเจฟเจ…เจ• เจ‰เจฆเฉ‡เจธเจผเจพเจ‚ เจฒเจˆ เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจ)เฅค เจตเจพเจงเฉ‚ เจฒเฉ‡เจ…เจฐเจพเจ‚ (เจตเจพเจœเจฌ เจธเฉ€เจฎเจพเจตเจพเจ‚ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ) เจจเฉ‚เฉฐ เจ˜เจŸเจพเจ‰เจฃ เจฒเจˆ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจพ เจ•เจฐเจจ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ เจ…เจคเฉ‡, เจ‡เจธเจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ, เจ‡เฉฑเจ• เจ‰เฉฑเจš เจฒเฉ‹เจก เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเฉ‹เฅค เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจธเจฟเจธเจŸเจฎ เจฆเฉ‡เจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจนเจŸเจพ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค เจธเจพเจจเฉ‚เฉฐ เจ‰เจคเจชเจพเจฆ 'เจคเฉ‡ เจธเจฟเฉฑเจงเจพ เจ‡เฉฑเจ• เจฎเฉเจ•เจพเจฌเจฒเจคเจจ เจธเจพเจซเจผ เจฒเฉ‹เจก เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจ‡เจ† เจนเฉˆเฅค
เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจŸเฉ‚เจฒเจธ เจฆเฉ‡ GNU เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆเฅค

เจชเจนเจฟเจฒเจพเจ‚, เจ†เจ“ เจ‡เจน เจชเจคเจพ เจ•เจฐเฉ€เจ เจ•เจฟ เจ‡เจน เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจ•เฉ€ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจคเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ•เจฟเจธ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ? เจ‡เจธเจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ:

msgstr "เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจœเจพเจ‚ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจ–เจฟเฉฑเจšเฉ‹เฅค"

เจ‰เฉฑเจฅเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฒเจฟเฉฐเจ• เจตเฉ€ เจฎเจฟเจฒเจฆเจพ เจนเฉˆ เจšเจฟเฉฑเจคเจฐเจพเจ‚, เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจ…เจคเฉ‡ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจกเจฐเจพเจˆเจตเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฎเจเฉ‹.

HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจ‡เฉฑเจฅเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจธเจฎเจ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‡เฉฑเจ• เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจ•เฉเจ เจชเจฐเจคเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเจฎเฉ‚เจน เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจจเจตเฉ€เจจเจคเจฎ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฌเจพเจฐเฉ‡ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจœเฉ‹ เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจนเฉˆเฅค เจ…เฉฑเจ—เฉ‡ เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ เจฐเจœเจฟเจธเจŸเจฐเฉ€ API.

เจ‡เจน เจนเฉ‡เจ  เจฒเจฟเจ–เจฟเจ† เจนเฉˆ:

"เจ‡เฉฑเจ• "เจšเจฟเฉฑเจคเจฐ" เจ‡เฉฑเจ• JSON เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจ…เจคเฉ‡ เจตเจฟเจ…เจ•เจคเฉ€เจ—เจค เจชเจฐเจค เจซเจพเจˆเจฒเจพเจ‚ เจฆเจพ เจธเฉเจฎเฉ‡เจฒ เจนเฉˆเฅค เจ‡เฉฑเจ• > เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจ–เจฟเฉฑเจšเจฃ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ‡เจนเจจเจพเจ‚ เจฆเฉ‹ เจนเจฟเฉฑเจธเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจฎเฉเฉœ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ‡ เจ†เจฒเฉ‡-เจฆเฉเจ†เจฒเฉ‡ เจ•เฉ‡เจ‚เจฆเจฐเจฟเจค เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค"

เจ‡เจธ เจฒเจˆ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจชเจนเจฟเจฒเจพ เจ•เจฆเจฎ เจนเฉˆ "เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจจเฉ‚เฉฐ เจ–เจฟเฉฑเจšเจฃเจพ".

เจฌเฉ‡เจธเจผเฉฑเจ•, เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเจผเฉ‚เจŸ เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจชเจฐ เจธเจพเจจเฉ‚เฉฐ เจ‡เจธ เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจฌเฉ‡เจจเจคเฉ€ เจนเฉˆ: GET /v2/{name}/manifests/{reference}

"เจจเจพเจฎ เจ…เจคเฉ‡ เจธเฉฐเจฆเจฐเจญ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจชเจ›เจพเจฃ เจ•เจฐเจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจนเจจเฅค เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจŸเฉˆเจ— เจœเจพเจ‚ เจกเจพเจ‡เจœเฉˆเจธเจŸ เจธเจผเจพเจฎเจฒ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค"

เจธเจพเจกเฉ€ เจกเฉŒเจ•เจฐ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจธเจฅเจพเจจเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ, เจ†เจ“ เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ:

curl -s -X GET "http://localhost:8081/link/to/docker/registry/v2/centos-11-10/manifests/1.1.1" -H "header_if_needed"

HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจœเจตเจพเจฌ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ json เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจœเจฟเจธ เจคเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซ เจฒเจพเจˆเจซเจฒเจพเจˆเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจพเจ‚, เจœเจพเจ‚ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจนเฉˆเจธเจผเจพเจ‚ เจตเจฟเฉฑเจš. เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจนเจฐ เจ‡เฉฑเจ• เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฒเฉฐเจ˜ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ…เฉฑเจ—เฉ‡ เจฆเจฟเฉฑเจคเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚: "GET /v2/{name}/blobs/{digest}"

"เจ‡เฉฑเจ• เจฒเฉ‡เจ…เจฐ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฆเฉ‡ เจจเจพเจฎ เจฆเฉเจ†เจฐเจพ เจ—เฉ‡เจŸ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€ เจชเจฐ เจกเจพเจ‡เจœเฉˆเจธเจŸ เจฆเฉเจ†เจฐเจพ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจตเจฟเจฒเฉฑเจ–เจฃ เจคเฉŒเจฐ 'เจคเฉ‡ เจชเจ›เจพเจฃ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ."

เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจกเจพเจ‡เจœเฉˆเจธเจŸ เจ‰เจน เจนเฉˆเจธเจผ เจนเฉˆ เจœเฉ‹ เจธเจพเจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจ‡เจ† เจนเฉˆเฅค

เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

curl -s -X GET "http://localhost:8081/link/to/docker/registry/v2/centos-11-10/blobs/sha256:f972d139738dfcd1519fd2461815651336ee25a8b54c358834c50af094bb262f" -H "header_if_needed" --output firstLayer

HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจ†เจ“ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจธเจพเจจเฉ‚เฉฐ เจ†เจ–เจฐเจ•เจพเจฐ เจชเจนเจฟเจฒเฉ€ เจฒเจพเจˆเจซเจฒเจพเจˆเจจ เจตเจœเฉ‹เจ‚ เจ•เจฟเจธ เจ•เจฟเจธเจฎ เจฆเฉ€ เจซเจพเจˆเจฒ เจฎเจฟเจฒเฉ€ เจนเฉˆเฅค

file firstLayer

HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจ‰เจน. เจฐเฉ‡เจฒเจœเจผ เจŸเจพเจฐ เจ†เจฐเจ•เจพเจˆเจต เจนเจจ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจขเฉเจ•เจตเฉ‡เจ‚ เจ•เฉเจฐเจฎ เจตเจฟเฉฑเจš เจ–เฉ‹เจฒเฉเจนเจฃ เจจเจพเจฒ เจ…เจธเฉ€เจ‚ เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจ†เจ“ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ€ เจฌเฉˆเจธเจผ เจธเจ•เฉเจฐเจฟเจชเจŸ เจฒเจฟเจ–เฉ€เจ เจคเจพเจ‚ เจœเฉ‹ เจ‡เจน เจธเจญ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจนเฉ‹ เจธเจ•เฉ‡

#!/bin/bash -eu

downloadDir=$1
# url as http://localhost:8081/link/to/docker/registry
url=$2
imageName=$3
tag=$4

# array of layers
layers=($(curl -s -X GET "$url/v2/$imageName/manifests/$tag" | grep -oP '(?<=blobSum" : ").+(?=")'))

# download each layer from array
for layer in "${layers[@]}"; do
    echo "Downloading ${layer}"
    curl -v -X GET "$url/v2/$imageName/blobs/$layer" --output "$downloadDir/$layer.tar"
done

# find all layers, untar them and remove source .tar files
cd "$downloadDir" && find . -name "sha256:*" -exec tar xvf {} ;
rm sha256:*.tar
exit 0

เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจจเจพเจฒ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚

./script.sh dirName โ€œhttp://localhost:8081/link/to/docker/registryโ€ myAwesomeImage 1.0

เจญเจพเจ— 2 - เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ

เจ‡เจน เจฅเฉ‹เฉœเจพ เจนเฉ‹เจฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจนเฉ‹เจตเฉ‡เจ—เจพ.

เจฆเฉ‡ เจจเจพเจฒ เจซเจฟเจฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ. เจ‡เจธ เจฒเจˆ เจธเจพเจจเฉ‚เฉฐ เจนเจฐเฉ‡เจ• เจฒเฉ€เจกเจฐ เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจ, เจธเฉฐเจฌเฉฐเจงเจฟเจค เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจตเฉ€ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ‡เจน เจธเจงเจพเจฐเจจ เจฒเฉฑเจ—เจฆเจพ เจนเฉˆ.

เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฆเจพ เจ…เจงเจฟเจเจจ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจกเจพเจŠเจจเจฒเฉ‹เจก เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจ•เจˆ เจชเฉœเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจก เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

  • เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค - "เจชเฉ‹เจธเจŸ /v2/{repoName}/blobs/uploads/"
  • เจ‡เฉฑเจ• เจฒเจพเจˆเจซเจฒเจพเจˆเจจ เจ…เฉฑเจชเจฒเฉ‹เจก เจ•เจฐเจจเจพ (เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจฎเฉ‹เจจเฉ‹เจฒเจฟเจฅเจฟเจ• เจ…เฉฑเจชเจฒเฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจญเจพเจต เจ…เจธเฉ€เจ‚ เจนเจฐ เจ‡เฉฑเจ• เจฒเจพเจˆเจซเจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจญเฉ‡เจœเจฆเฉ‡ เจนเจพเจ‚) - "PUT /v2/{repoName}/blobs/uploads/{uuid}?digest={digest}
    เจธเจฎเฉฑเจ—เจฐเฉ€-เจฒเฉฐเจฌเจพเจˆ: {เจชเจฐเจค เจฆเจพ เจ†เจ•เจพเจฐ}
    เจธเจฎเฉฑเจ—เจฐเฉ€-เจ•เจฟเจธเจฎ: เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ/เจ“เจ•เจŸเฉ‡เจŸ-เจธเจŸเฉเจฐเฉ€เจฎ
    เจฒเฉ‡เจ…เจฐ เจฌเจพเจˆเจจเจฐเฉ€ เจกเจพเจŸเจพ"เฅค
  • เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ - "PUT /v2/{repoName}/manifests/{reference}"เฅค

เจชเจฐ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจ‡เฉฑเจ• เจ•เจฆเจฎ เจ–เฉเฉฐเจ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจ•เฉเจ เจตเฉ€ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเฉ‡เจ—เจพเฅค เจฎเฉ‹เจจเฉ‹เจฒเจฟเจฅเจฟเจ• เจฒเฉ‹เจกเจฟเฉฐเจ— เจฒเจˆ, เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจ…เฉฐเจธเจผเจ• (เจšเฉฐเจ•เจก) เจฒเจˆ, เจฐเฉ‡เจฒ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเฉˆเจš เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจจเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ:

"PATCH /v2/{repoName}/blobs/uploads/{uuid}
เจธเจฎเฉฑเจ—เจฐเฉ€-เจฒเฉฐเจฌเจพเจˆ: {เจšเฉฐเจ• เจฆเจพ เจ†เจ•เจพเจฐ}
เจธเจฎเฉฑเจ—เจฐเฉ€-เจ•เจฟเจธเจฎ: เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ/เจ“เจ•เจŸเฉ‡เจŸ-เจธเจŸเฉเจฐเฉ€เจฎ
{เจฒเฉ‡เจ…เจฐ เจšเฉฐเจ• เจฌเจพเจˆเจจเจฐเฉ€ เจกเฉ‡เจŸเจพ}"เฅค

เจจเจนเฉ€เจ‚ เจคเจพเจ‚, เจคเฉเจธเฉ€เจ‚ เจชเจนเจฟเจฒเฉ‡ เจฌเจฟเฉฐเจฆเฉ‚ เจคเฉ‹เจ‚ เจ…เฉฑเจ—เฉ‡ เจจเจนเฉ€เจ‚ เจตเจง เจธเจ•เฉ‹เจ—เฉ‡, เจ•เจฟเจ‰เจ‚เจ•เจฟ ... เจธเฉฐเจญเจพเจตเจฟเจค เจœเจตเจพเจฌ เจ•เฉ‹เจก 202 เจฆเฉ€ เจฌเจœเจพเจ, เจคเฉเจนเจพเจจเฉ‚เฉฐ 4xx เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจนเฉเจฃ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจธเจฆเจพ เจนเฉˆ:

  • เจ†เจฐเฉฐเจญเจ•เจฐเจฃ
  • เจชเฉˆเจš เจฐเฉ‡เจฒ
  • เจนเฉˆเจ‚เจกเจฐเฉ‡เจฒ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ
  • เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ
    เจ…เฉฐเจ• 2 เจ…เจคเฉ‡ 3, เจ•เฉเจฐเจฎเจตเจพเจฐ, เจœเจฟเฉฐเจจเฉ€ เจตเจพเจฐ เจฒเจพเจˆเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจ“เจจเฉ€ เจตเจพเจฐ เจฆเฉเจนเจฐเจพเจ‡เจ† เจœเจพเจตเฉ‡เจ—เจพเฅค

เจชเจนเจฟเจฒเฉ€, เจธเจพเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ. เจฎเฉˆเจ‚ archlinux:latest เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เจพ

docker pull archlinux

HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจนเฉเจฃ เจนเฉ‹เจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฒเจˆ เจ‡เจธเจจเฉ‚เฉฐ เจธเจฅเจพเจจเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเฉ€เจ

docker save c24fe13d37b9 -o savedArch

HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจฎเฉŒเจœเฉ‚เจฆเจพ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจจเจคเฉ€เจœเฉ‡ เจชเฉเจฐเจพเจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจ–เฉ‹เจฒเฉเจนเฉ‹

tar xvf savedArch

HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจตเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจนเจฐเฉ‡เจ• เจœเฉ€เจตเจจ เจฐเฉ‡เจ–เจพ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจนเฉˆเฅค เจนเฉเจฃ เจ†เจ‰ เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ‡ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจฆเฉ€ เจฌเจฃเจคเจฐ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ

cat manifest.json | json_pp

HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจœเจฟเจ†เจฆเจพ เจจเจนเฉ€. เจ†เจ“ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจฒเฉ‹เจก เจ•เจฐเจจ เจฒเจˆ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจฆเฉ€ เจ•เฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจ…เจจเฉเจธเจพเจฐ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ.

HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ เจชเฉเฉฑเจฒ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเฉเจธเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡, เจฎเฉŒเจœเฉ‚เจฆเจพ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸเฉ‹ เจธเจพเจกเฉ‡ เจฒเจˆ เจ…เจจเฉเจ•เฉ‚เจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจฌเจฒเฉˆเจ•เจœเฉˆเจ• เจ…เจคเฉ‡ เจตเฉ‡เจธเจผเจฟเจ†, เจฒเจพเจˆเจซเจฒเจพเจˆเจจเจพเจ‚ เจ…เจคเฉ‡ เจธเฉฐเจฐเจšเจจเจพเจตเจพเจ‚ เจจเจพเจฒ เจ†เจชเจฃเจพ เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡เฅค

เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจนเจฎเฉ‡เจธเจผเจพ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ‡เฉฑเจ• เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจˆเจฒ เจ…เจคเฉ‡ เจœเฉ€เจตเจจ เจฐเฉ‡เจ–เจพเจตเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจฒเฉœเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจธเจ•เฉ€เจฎ เจธเฉฐเจธเจ•เจฐเจฃ 2 (เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจฎเฉŒเจœเฉ‚เจฆเจพ), เจฎเฉ€เจกเฉ€เจ† เจŸเจพเจˆเจช เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฟเจ† เจจเจนเฉ€เจ‚ เจœเจพเจตเฉ‡เจ—เจพ:

echo โ€˜{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
   "config": {
      "mediaType": "application/vnd.docker.container.image.v1+json",
      "size": config_size,
      "digest": "config_hash"
   },
   "layers": [
      โ€™ > manifest.json

เจฎเฉ‚เจฒ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจฌเจฃเจพเจ‰เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธเจจเฉ‚เฉฐ เจตเฉˆเจง เจกเฉ‡เจŸเจพ เจจเจพเจฒ เจญเจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจฐเฉ‡เจฒ เจ†เจฌเจœเฉˆเจ•เจŸ เจฆเฉ‡ json เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

{
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": ${layersSizes[$i]},
         "digest": "sha256:${layersNames[$i]}"
      },

เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจนเจฐเฉ‡เจ• เจฐเฉ‡เจฒ เจฒเจˆ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจ…เฉฑเจ—เฉ‡, เจธเจพเจจเฉ‚เฉฐ เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจˆเจฒ เจฆเฉ‡ เจ†เจ•เจพเจฐ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจ…เจคเฉ‡ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจตเจฟเฉฑเจš เจธเจŸเฉฑเจฌเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจธเจฒ เจกเฉ‡เจŸเจพ เจจเจพเจฒ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค

sed -i "s/config_size/$configSize/g; s/config_hash/$configName/g" $manifestFile

เจนเฉเจฃ เจคเฉเจธเฉ€เจ‚ เจกเจพเจ‰เจจเจฒเฉ‹เจก เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจ‡เฉฑเจ• uuid เจฌเจšเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเฉ‹ เจฌเจพเจ…เจฆ เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ‡ เจจเจพเจฒ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

เจชเฉ‚เจฐเฉ€ เจธเจ•เฉเจฐเจฟเจชเจŸ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆ:

#!/bin/bash -eux

imageDir=$1
# url as http://localhost:8081/link/to/docker/registry
url=$2
repoName=$3
tag=$4
manifestFile=$(readlink -f ${imageDir}/manifestCopy)
configFile=$(readlink -f $(find $imageDir -name "*.json" ! -name "manifest.json"))

# calc layers sha 256 sum, rename them accordingly, and add info about each to manifest file
function prepareLayersForUpload() {
  info_file=$imageDir/info
  # lets calculate layers sha256 and use it as layers names further
  layersNames=($(find $imageDir -name "layer.tar" -exec shasum -a 256 {} ; | cut -d" " -f1))

  # rename layers according to shasums. !!!Set required amount of fields for cut command!!!
  # this part definitely can be done easier but i didn't found another way, sry
  find $imageDir -name "layer.tar" -exec bash -c 'mv {} "$(echo {} | cut -d"/" -f1,2)/$(shasum -a 256 {} | cut -d" " -f1)"' ;

  layersSizes=($(find $imageDir -name "*.tar" -exec ls -l {} ; | awk '{print $5}'))

  for i in "${!layersNames[@]}"; do
    echo "{
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": ${layersSizes[$i]},
         "digest": "sha256:${layersNames[$i]}"
      }," >> $manifestFile
  done
  # remove last ','
  truncate -s-2 $manifestFile
  # add closing brakets to keep json consistent
  printf "nt]n}" >> $manifestFile
}

# calc config sha 256 sum and add info about it to manifest
function setConfigProps() {
  configSize=$(ls -l $configFile | awk '{print $5}')
  configName=$(basename $configFile | cut -d"." -f1)

  sed -i "s/config_size/$configSize/g; s/config_hash/$configName/g" $manifestFile
}

#prepare manifest file
prepareLayersForUpload
setConfigProps
cat $manifestFile

# initiate upload and get uuid
uuid=$(curl -s -X POST -I "$url/v2/$repoName/blobs/uploads/" | grep -oP "(?<=Docker-Upload-Uuid: ).+")

# patch layers
# in data-binary we're getting absolute path to layer file
for l in "${!layersNames[@]}"; do
  pathToLayer=$(find $imageDir -name ${layersNames[$l]} -exec readlink -f {} ;)
    curl -v -X PATCH "$url/v2/$repoName/blobs/uploads/$uuid" 
  -H "Content-Length: ${layersSizes[$i]}" 
  -H "Content-Type: application/octet-stream" 
  --data-binary "@$pathToLayer"

# put layer
  curl -v -X PUT "$url/v2/$repoName/blobs/uploads/$uuid?digest=sha256:${layersNames[$i]}" 
  -H 'Content-Type: application/octet-stream' 
  -H "Content-Length: ${layersSizes[$i]}" 
  --data-binary "@$pathToLayer"
done

# patch and put config after all layers
curl -v -X PATCH "$url/v2/$repoName/blobs/uploads/$uuid" 
  -H "Content-Length: $configSize" 
  -H "Content-Type: application/octet-stream" 
  --data-binary "@$configFile"

  curl -v -X PUT "$url/v2/$repoName/blobs/uploads/$uuid?digest=sha256:$configName" 
  -H 'Content-Type: application/octet-stream' 
  -H "Content-Length: $configSize" 
  --data-binary "@$configFile"

# put manifest
curl -v -X PUT "$url/v2/$repoName/manifests/$tag" 
  -H 'Content-Type: application/vnd.docker.distribution.manifest.v2+json' 
  --data-binary "@$manifestFile"

exit 0

เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจคเจฟเจ†เจฐ เจธเจ•เฉเจฐเจฟเจชเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

./uploadImage.sh "~/path/to/saved/image" "http://localhost:8081/link/to/docker/registry" myRepoName 1.0

เจฏเฉ‚เจชเฉ€เจกเฉ€:
เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚ เจธเจพเจจเฉ‚เฉฐ เจ•เฉ€ เจฎเจฟเจฒเจฟเจ†?
เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฒเจˆ เจ…เจธเจฒ เจกเฉ‡เจŸเจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจŸเฉˆเจธเจŸ เจฌเจฒเฉ‡เจœเจผเจฎเฉ€เจŸเจฐ เจตเจฟเฉฑเจš เจšเจฒเจพเจ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ 'เจคเฉ‡ เจกเฉ‡เจŸเจพ เจฌเจนเฉเจค เจœเจพเจฃเจ•เจพเจฐเฉ€ เจญเจฐเจชเฉ‚เจฐ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพ, เจธเจผเฉเฉฑเจง HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ‡ เจ‰เจฒเจŸเฅค

เจฆเฉ‚เจœเจพ, เจชเจฐเจฟเจตเจฐเจคเจจ เจจเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจกเฉŒเจ•เจฐ เจ…เจชเจฒเฉ‹เจก เจฒเจˆ เจตเจฐเจšเฉเจ…เจฒ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจจเฉ‚เฉฐ เจฒเจ—เจญเจ— 150% เจตเจงเจพเจ‰เจฃ เจ…เจคเฉ‡ เจ”เจธเจค เจœเจตเจพเจฌ เจธเจฎเจพเจ‚ 20-25% เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฑเจคเฉ€เฅค เจกเฉŒเจ•เจฐ เจกเจพเจ‰เจจเจฒเฉ‹เจก เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจจเฉ‚เฉฐ 500% เจตเจงเจพเจ‰เจฃ เจตเจฟเฉฑเจš เจ•เจพเจฎเจฏเจพเจฌ เจฐเจนเฉ‡, เจœเจฆเฉ‹เจ‚ เจ•เจฟ เจ”เจธเจค เจœเจตเจพเจฌ เจธเจฎเจพเจ‚ เจฒเจ—เจญเจ— 60% เจ˜เจŸเจฟเจ†เฅค

เจคเฉเจนเจพเจกเฉ‡ เจงเจฟเจ†เจจ เจฒเจˆ เจงเฉฐเจจเจตเจพเจฆ.

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹