어느 날 openjdk:21-slim이 사라졌다: deprecated 베이스 이미지에서 eclipse-temurin으로

@yunhobb· November 04, 2025 · 3 min read

여러 서비스(admin·customer·message·scheduler)의 Dockerfile이 모두 FROM openjdk:21-slim을 베이스 이미지로 쓰고 있었습니다. 한동안 잘 빌드되던 이미지였는데, 어느 날 빌드가 베이스 이미지를 받지 못하고 실패했습니다. 이 글은 그 원인이 "이미지 태그가 사라진 것"이었고, 왜 사라질 수 있었는지, 그리고 eclipse-temurin:21-jdk로 옮긴 과정을 정리합니다.


1. 현상: 베이스 이미지를 더 이상 받지 못한다

빌드는 FROM openjdk:21-slim에서 멈췄습니다. 이미지를 받는 단계에서 해당 태그를 찾지 못하는 형태의 에러입니다.

ERROR: failed to solve: openjdk:21-slim:
  failed to resolve source metadata for docker.io/library/openjdk:21-slim:
  docker.io/library/openjdk:21-slim: not found

애플리케이션 코드도, Dockerfile의 그 외 내용도 바뀐 게 없었습니다. 바뀐 것은 Docker Hub 쪽, 즉 openjdk:21-slim이라는 태그를 더 이상 받을 수 없게 된 것뿐이었습니다. 빌드 캐시에 남아 있던 동안에는 문제가 드러나지 않다가, 캐시가 없는 환경에서 새로 받는 순간 실패하는 식이었습니다.

참고: 위 에러는 태그를 찾지 못할 때 나오는 전형적인 형태로 적은 것입니다. 메시지 문구는 빌더(BuildKit·docker build)와 버전에 따라 manifest unknown 등으로 조금씩 다릅니다.


2. 원인: openjdk 공식 이미지는 2022년에 deprecated됐다

Docker Hub의 openjdk 공식 이미지(Docker Official Image)는 2022년 7월에 deprecated 처리됐습니다. 이미지 설명에 다음과 같이 명시되어 있습니다.

This image is officially deprecated and all users are recommended to find and use suitable replacements ASAP.

deprecated가 곧 "즉시 삭제"는 아니지만, 더 이상 유지보수되지 않는다는 게 핵심입니다. 공식 안내는 권장 대체 이미지로 다섯 가지를 제시합니다: Amazon Corretto, Eclipse Temurin, IBM Semeru Runtimes, IBM Java, SAPMachine.

여기서 한 가지를 더 확인해야 현상이 설명됩니다. openjdk 이미지는 Oracle이 jdk.java.net에 올리는 레퍼런스/EA(Early Access) 빌드를 받아 패키징한 것입니다. 그리고 deprecated 이후 공식 설명은, 계속 갱신되는 태그는 EA 빌드뿐이라고 분명히 밝히고 있습니다.

The only tags which will continue to receive updates beyond July 2022 will be Early Access builds.

즉 지금 openjdk 저장소에 남아 있는 태그는 아직 정식 출시 전인 버전의 EA 빌드(예: 차기 버전 -ea)이고, 이미 GA(정식 출시)된 버전의 태그는 유지 대상이 아닙니다.


3. 왜 하필 21-slim이 사라졌나

openjdk:21-slim은 GA된 JDK 21을 담은 태그였습니다. 위 두 사실을 합치면 이 태그가 사라진 경위를 설명할 수 있습니다.

  • 이미지의 원본 바이너리는 jdk.java.net의 레퍼런스/EA 빌드다. 이 빌드의 다운로드는 한시적으로만 제공되고, 버전이 GA로 넘어가거나 다음 버전으로 대체되면 내려간다.
  • deprecated 이후 openjdk는 EA 태그만 갱신한다. GA가 된 21 태그는 더 이상 관리되지 않는다.

그래서 JDK 21이 EA이던 시기에는 openjdk:21(과 그 변형인 21-slim)이 존재했지만, 21이 GA로 넘어가면서 원본 EA 바이너리가 내려가고 태그도 더 이상 유지되지 않아, 어느 시점부터 받을 수 없게 된 것으로 보입니다.

참고: deprecated 시점(2022년 7월)과 "EA 태그만 유지" 정책, 권장 대체 이미지 목록은 공식 문서로 확인한 사실입니다. 반면 "21-slim이 정확히 언제, 어떤 순서로 내려갔는가"는 위 정책으로부터 추론한 것이고, 제거 시점을 일자 단위로 확인하지는 못했습니다.


4. 교체: eclipse-temurin:21-jdk

대체 이미지로 Eclipse Temurin을 골랐습니다. Eclipse Temurin은 Adoptium 프로젝트가 관리하는 벤더 중립 OpenJDK 배포판이고, 공식 안내에서도 openjdk 이미지의 직접적인 대체로 권장합니다. 교체는 FROM 한 줄만 바꾸면 됩니다.

# 변경 전
FROM openjdk:21-slim

# 변경 후
FROM eclipse-temurin:21-jdk

태그를 고를 때 두 가지를 짚었습니다.

  • slim이라는 접미사는 그대로 옮겨오지 않는다. openjdk-slim은 Debian slim 기반을 뜻했는데, eclipse-temurin의 태그 체계는 다르다. 기본 태그(21-jdk)와 OS 변형(21-jdk-jammy, -noble, -alpine 등)으로 나뉜다. 그래서 21-slim에 일대일로 대응되는 태그를 찾기보다, JDK가 필요하면 21-jdk를 쓰는 방식으로 옮겼다.
  • jdkjrejdk를 골랐다. 애플리케이션 실행만 보면 더 작은 21-jre도 후보다. 다만 이번에는 기존 동작(JDK 전체가 들어 있던 openjdk 이미지)과 차이를 만들지 않으려고 jdk로 맞췄다. 이미지 크기를 줄이는 jre 전환은 따로 검증한 뒤에 다루는 게 안전하다고 봤다.

같은 베이스를 쓰던 네 개 Dockerfile(admin·customer·message·scheduler)을 모두 eclipse-temurin:21-jdk로 바꿨습니다. 그 아래의 apt-get 설치 항목(procps, fontconfig 등)은 Temurin도 Debian/Ubuntu 계열이라 그대로 두어도 동작했습니다.


5. 마무리: 베이스 이미지도 공급망이다

이번 일에서 얻은 건, 애플리케이션이 의존하는 베이스 이미지도 외부 공급망이고 그쪽 정책 변화로 어느 날 빌드가 실패할 수 있다는 점입니다. 특히 deprecated된 이미지는 "지금 당장은 받아진다"는 이유로 미뤄두면, 원본 바이너리가 내려가는 순간 통보 없이 멈춥니다.

  • deprecated 공지가 뜬 베이스 이미지는 받아지는 동안 미리 옮긴다. 빌드가 실패한 다음 옮기면 배포가 중단된 상태에서 급하게 처리하게 된다.
  • 받아지는 동안에도 출처가 유지보수되는지를 본다. openjdk처럼 "받아지지만 갱신은 안 되는" 상태가 가장 위험하다. 보안 패치가 멈춰 있기 때문이다.
  • 재현성을 위해 태그를 다이제스트(@sha256:...)로 고정하는 방법도 있다. 다만 이번 사례처럼 원본 자체가 내려가면 다이제스트 고정도 새로 받는 환경은 막지 못하므로, 결국 유지보수되는 출처로 옮기는 게 근본 해결이다.
@yunhobb
녹차 주도 개발