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)"'
반응형