Base Image EOL Lint - Dockerfile and CI end-of-life check

Marks every base image in your Dockerfiles, compose files and CI workflows whose security patches have already stopped - or stop before 13 November 2026 - and prints the tag that replaces it.

Install free

Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.

VS Code MarketplaceOpen VSX (Cursor, VSCodium)npmMCP server (npx)Docker Hub
ext install ReadyStack.base-image-eol-lint
npx @readystack/base-image-eol-lint <file>
npx @readystack/base-image-eol-lint --mcp

Team? One key for every ReadyStack linter, 5 seats, $149 once

Get the full rule table as a PDF
All 21 rules Base Image EOL Lint - Dockerfile and CI end-of-life check checks, each with its source and date, on printable pages you can hand to your team or auditor. We email it now, and once more only if a rule changes. No newsletter.

Get the full version $29

Scans every Dockerfile, compose file and workflow in the repository at once, writes a dated CSV/JSON/HTML report, and prints machine-readable output so CI fails the build before an unpatched base image ships.

One payment, one licence key for this tool. The key is shown right after payment.

Snyk's Team tier is $25 per contributing developer per month.

Buy the full version — $29
ENDEJAESPT

Find a tool

· ReadyStack

Worked example

Real numbers from this tool, line by line.

Five base images stop getting security patches - and they are all in one repo

Five images in the snippet below have already stopped getting security patches or stop before 13 November 2026, and Base Image EOL Lint marks all five the moment a platform engineer opens the file:


FROM node:20-alpine
# api/Dockerfile
FROM python:3.10-slim
# .github/workflows/ci.yml
    runs-on: ubuntu-20.04
# docker-compose.yml
    image: postgres:14
# services/report/Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:8.0

Line 2 pins Node.js 20, which reached end-of-life on 30 April 2026. Line 6 pins the Ubuntu 20.04 runner, which left standard support on 31 May 2025 and now needs a paid Ubuntu Pro subscription to receive anything. Those two are already unpatched.

The other three are worse, because they are still fine today. Python 3.10 reached end-of-life on 1 October 2026. Alpine 3.21, which keeps a branch for two years, ends on 1 November 2026. .NET 8 and .NET 9 both reach end of support on 10 November 2026 - the LTS release dies on the same day as the short-term one. PostgreSQL 14 follows on 12 November 2026. Debian 11 bullseye already went on 31 August 2026, so every -bullseye variant of every language image went with it.

That is four vendors retiring five runtimes inside a fortnight, and nothing in your monitoring will go red on any of those days. The container keeps starting. The build keeps passing. What stops is the flow of patches, and you find out at the next CVE.

The second failure is the one nobody plans for: the model wrote it. A code assistant trained before those dates will hand you FROM node:20-bullseye and FROM python:3.10-slim without hesitation, because both were the sensible answer when it learned them. Base images are the one place where a suggestion silently ages, and the year in the training data becomes the year in your Dockerfile.

Image scanners do not catch this. They test an image that has already been built and pushed, and they report the vulnerable packages inside it - a real job, and a different one. None of them opens the file on your screen and tells you that the FROM line names a runtime whose last security release is seven weeks away. By the time a scanner can see the image, you have already built it, tagged it and pushed it.

Base Image EOL Lint ships 21 rules covering Node.js, Python, Debian, Ubuntu, Alpine, .NET, PostgreSQL, MySQL, PHP, CentOS, the deprecated openjdk official image and floating :latest tags. It runs per line, in the editor, with no network call, no account and no build step. Each finding carries a severity - error for an image that is already unpatched, warn for one with a date on the calendar - and the exact tag that replaces it: node:20-alpine becomes node:24-trixie, python:3.10-slim becomes python:3.13-trixie, postgres:14 becomes postgres:17.

Checking the file you have open is free and complete: all 21 rules, every finding, every replacement, no watermark and no run limit. The licence changes the scope, not the answer - it walks every Dockerfile, compose file and workflow in the repository, writes a dated CSV, JSON or HTML report you can attach to a change ticket, and prints JSON that lets CI fail the build before an unpatched base image reaches production.

The first of those dates was 1 October 2026. Grep your repository for -bullseye today, or open the file and let 21 rules do it.

15 seconds — what it actually does

Questions people ask

What does Base Image EOL Lint actually do?

It reads the image references written in your repository - Dockerfile FROM lines, docker-compose image keys, GitHub Actions runner labels and container images - and marks every one whose vendor has stopped shipping security patches, or stops soon, with the exact tag that replaces it and the date behind the finding.

Who is it for?

Platform, DevOps and backend engineers who own the Dockerfiles and CI workflows in a repository: the person who answers when an auditor asks which base images are still supported, and the person who has to do the upgrade. If you maintain a multi-stage Dockerfile or a compose file, this reads your files.

Why will a free image scanner not do this?

Free scanners test an image that has already been built and pushed, and they report the vulnerable packages inside it. They cannot open the Dockerfile on your screen and tell you that FROM python:3.10-slim names a runtime whose security support ended on 1 October 2026. Nothing that needs a built image can.

What is free and what needs a licence?

Free covers one whole file: open a Dockerfile, run the check, and all 21 rules report every finding with its severity and its replacement tag. Nothing is watermarked, timed or locked after N runs. The licence changes the scope only - every file in the repository at once, a dated exported report, and JSON for CI.

What would this cost otherwise?

Snyk's Team tier is $25 per contributing developer per month, and it still starts from a built image rather than the file you are editing. Auditing FROM lines by hand means grepping every repository each time a vendor retires a branch, which happens several times a year. This is $29 once.

Why not just ask ChatGPT or another AI chat?

A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Dockerfile EOL Lint - base image end-of-life (FROM tags) checks the file you open against 21 rules from a rule set dated 2026-09-20, and points at the exact line with the fix. For a filing, an audit or a client you need that dated result on your own files.

Ask about this tool

One question, answered by the person who built it. Your email only if you want the answer sent.

Embed this tool on your site (free)

Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.

 All embeddable tools

For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →