Docker Hub 이미지(JDK, Node.js, Gradle) 최신 태그 확인하기

보안 취약점(CVE) 대응이나 정기 업데이트를 진행할 때, 브라우저에서 Docker Hub 페이지를 일일이 뒤지는 대신 터미널에서 curl과 jq만으로 공식 베이스 이미지(eclipse-temurin, node, gradle)의 최신 태그와 릴리스 여부를 빠르게 확인하는 방법을 정리했습니다.

1. Docker Hub 태그 API 기본 구조

Docker Hub v2 API를 활용하면 별도의 인증 없이도 공식 이미지의 태그 목록을 조회할 수 있습니다.

https://hub.docker.com/v2/repositories/library/<image>/tags?page_size=100&name=<검색어>
  • 주요 응답 필드: .results[].name(태그명), .results[].last_updated(마지막 push 시각)
  • 조회 범위 제한 (name=): page_size의 최댓값은 100입니다. 태그 수가 많은 공식 이미지는 반드시 name= 파라미터로 버전이나 OS variant 범위를 좁혀야 누락 없이 조회할 수 있습니다.
  • 정렬 주의사항 (ordering=last_updated): 최근 갱신순 정렬 옵션을 붙일 수 있지만, 기존 버전의 메타데이터만 다시 push되어도 갱신 시각이 바뀌므로 날짜만 보고 최신 버전으로 판단해서는 안 됩니다.

2. JDK (eclipse-temurin)

태그 규칙 및 특징

  • 기본 형식: <버전>_<빌드번호>-<jdk|jre>-<OS variant> (예: 21.0.12_8-jdk-alpine)
  • Respin(재빌드) 버전: 패치나 재빌드가 발생하면 버전 끝에 .1이 추가됩니다. (예: 21.0.12.1_1-jdk-alpine)
  • OS Variant: alpine(floating), alpine-3.24(버전 고정), noble(Ubuntu 24.04), ubi10-minimal 등

주요 조회 명령어

  • LTS 라인별(17 / 21 / 25) 최신 태그 확인
    단순히 sort -V만 사용하면 respin 태그(21.0.12.1_1)가 일반 태그(21.0.12_8)보다 앞에 정렬될 수 있어 정렬 기준을 보정해 조회합니다. (jdk-noble, jre-alpine 등으로 변경 가능)
for v in 17 21 25; do
  printf "JDK $v: "
  curl -s "https://hub.docker.com/v2/repositories/library/eclipse-temurin/tags?page_size=100&name=${v}.0." \
    | jq -r '.results[].name | select(endswith("-jdk-alpine"))' \
    | awk -F'_' '{ if ($1 ~ /^[0-9]+\.[0-9]+\.[0-9]+$/) print $1".0_"$2; else print $0 }' \
    | sort -V | tail -n 1 | sed 's/\.0_/_/'
done
  • 특정 버전 출시 여부 확인
    결과가 비어 있으면 아직 Docker Hub에 퍼블리시되지 않은 상태입니다.
curl -s "https://hub.docker.com/v2/repositories/library/eclipse-temurin/tags?page_size=100&name=21.0.13" \
  | jq -r '.results[].name' | sort -V
  • Docker Hub 반영 전 공식 출시 여부 먼저 확인하기 (Adoptium API)
    Temurin은 Adoptium에 GA가 먼저 릴리스되고 보통 며칠 뒤 Docker Hub에 반영됩니다. Adoptium의 jdk-21.0.13+9는 Docker 태그 21.0.13_9에 대응하며, 경로의 /ga를 /ea로 바꾸면 출시 전 Early Access 빌드도 확인할 수 있습니다.
for v in 17 21 25; do
  echo "== JDK $v =="
  curl -s "https://api.adoptium.net/v3/assets/feature_releases/$v/ga?image_type=jdk&os=alpine-linux&architecture=x64&page_size=1" \
    | jq -r '.[].release_name'
done

3. Node.js (node)

태그 규칙 및 특징

  • 기본 형식: <버전 또는 코드네임>-<OS variant> (예: 24.22.1-alpine3.24, krypton-alpine3.24)
  • Floating 태그 주의: 코드네임(krypton=24, jod=22)이나 메이저 버전만 적힌 태그(24-alpine)는 계속 가리키는 대상이 바뀌는 floating 태그이므로, 빌드 재현성을 위해 전체 버전(Full version)으로 고정하는 것이 안전합니다.
  • Alpine 표기 차이: Temurin(-alpine-3.24)과 달리 하이픈 없이 -alpine3.24 형태로 표기합니다.

주요 조회 명령어

  • 특정 메이저 라인의 최신 태그 확인 (다른 라인은 24.와 ^24\.를 22. 등으로 변경)
curl -s "https://hub.docker.com/v2/repositories/library/node/tags?page_size=100&name=24." \
  | jq -r '.results[].name | select(test("^24\\.[0-9]+\\.[0-9]+-alpine[0-9.]+$"))' \
  | sort -V | tail -n 1
  • 보안 릴리스 여부 및 내장 OpenSSL 버전 확인 (nodejs.org)
curl -s https://nodejs.org/dist/index.json \
  | jq -r '[.[] | select(.version|startswith("v24."))][0] | "\(.version) \(.date) security=\(.security) openssl=\(.openssl)"'
  • LTS 및 EOL 지원 일정 확인
curl -s https://raw.githubusercontent.com/nodejs/Release/main/schedule.json \
  | jq -r 'to_entries[] | select(.key|test("^v(20|22|24)$")) | "\(.key): LTS=\(.value.lts // "N/A") ~ EOL=\(.value.end)"'

4. 빌드용 Gradle (gradle)

태그 규칙 및 특징

  • 기본 형식: <Gradle버전>-jdk<자바버전>-<variant> (예: 9.8.2-jdk21-alpine, 8.14.6-jdk21-noble)
  • OS Variant: alpine, noble, jammy, corretto, graal, ubi9 및 variant 생략 태그(-jdk21)
  • 베이스 이미지 의존성: Gradle 공식 이미지의 기본 JDK 베이스는 eclipse-temurin입니다. 따라서 JDK 보안 취약점을 패치하려면 Temurin 이미지가 먼저 업데이트된 후 Gradle 이미지가 재빌드되어야 반영됩니다.

주요 조회 명령어

  • JDK 라인별 최신 Gradle 태그 확인
for v in 17 21 25; do
  printf "jdk$v: "
  curl -s "https://hub.docker.com/v2/repositories/library/gradle/tags?page_size=100&name=jdk${v}-alpine" \
    | jq -r '.results[].name | select(test("^[0-9]+\\.[0-9]+(\\.[0-9]+)?-jdk'"$v"'-alpine$"))' \
    | sort -V | tail -n 1
done
  • 특정 Gradle 버전의 세부 태그 목록 조회
curl -s "https://hub.docker.com/v2/repositories/library/gradle/tags?page_size=100&name=8.14.6-jdk21" \
  | jq -r '.results[].name' | sort -V
  • Gradle 공식 최신 릴리스 확인 (services.gradle.org)
# 현재 최신 버전
curl -s https://services.gradle.org/versions/current | jq -r '"\(.version) (\(.buildTime))"'

# 메이저 라인별(8 / 9) 최신 정식 버전
curl -s https://services.gradle.org/versions/all \
  | jq -r '[.[] | select(.snapshot==false and .nightly==false and .releaseNightly==false and .rcFor=="")] | group_by(.version | split(".")[0])[] | first | "\(.version | split(".")[0]): \(.version)"'

 

반응형