Analisi delle buone pratiche Dockerfile con righe
Questo analizzatore di buone pratiche per Dockerfile verifica tre problemi comuni prima che un’immagine raggiunga il sistema di build.
Esegui gratis nel browser
Segnala l’assenza di WORKDIR, le immagini di base che usano il tag mutabile latest e le istruzioni RUN consecutive che possono creare livelli superflui. Ogni risultato include la riga sorgente, un tipo stabile e una spiegazione diretta, utile sia quando Lei esamina il file sia in un controllo automatizzato di integrazione continua.
Ottenga un rapporto Dockerfile sintetico e pratico
Incolli l’intero contenuto del Dockerfile nel campo di testo ed esegua il controllo. La risposta indica se il file ha superato la verifica, conta i risultati ed elenca ogni problema con un numero di riga a partire da uno, un tipo stabile interpretabile dalle macchine e un messaggio conciso. L’analizzatore si concentra intenzionalmente su tre rischi frequenti di manutenzione e non intende sostituire una suite completa per la sicurezza dei container. Un WORKDIR mancante viene indicato alla riga 1 perché riguarda l’intero file. Un’istruzione FROM è segnalata sulla propria riga quando l’immagine usa latest esplicitamente oppure omette il tag e quindi corrisponde a latest. Quando due RUN sono consecutivi, viene segnalato il secondo con un riferimento alla riga precedente. Commenti e righe vuote non nascondono tale relazione. Un file corretto restituisce un array findings vuoto, così valid può fungere direttamente da condizione di successo. Le continuazioni con barra inversa costituiscono un’unica istruzione logica e mantengono come posizione la prima riga fisica mostrata nell’editor.
Comprenda perché queste tre pratiche contano
WORKDIR rende esplicito il contesto del file system per le successive istruzioni RUN, COPY, CMD ed ENTRYPOINT. Senza questa dichiarazione, il build eredita silenziosamente una directory scelta dall’immagine di base, che potrebbe cambiare con un aggiornamento. Fissare l’immagine di FROM tramite un tag versionato o un digest immutabile migliora la riproducibilità. Sia un riferimento senza tag sia latest possono puntare a contenuti differenti anche se il Dockerfile non è cambiato. Inoltre, ogni RUN crea normalmente un livello del file system. Comandi consecutivi di installazione, pulizia o configurazione spesso appartengono a una singola operazione shell, affinché i file temporanei vengano rimossi nello stesso livello e la cronologia resti comprensibile. Il risultato è formulato come raccomandazione perché RUN separati possono essere intenzionali quando i confini della cache favoriscono un flusso consolidato. Lo strumento non riscrive i comandi e non presume che ogni unione sia sicura. La scelta finale spetta a chi conosce il build, la strategia di cache e il comportamento dei comandi in caso di errore.
Esegua il controllo prima dei build più costosi
Utilizzi l’analizzatore nell’editor, prima di un commit o all’inizio dell’integrazione continua, prima di scaricare immagini di base e compilare l’applicazione. Invii il testo sorgente originale anziché una rappresentazione già analizzata, così da conservare le righe fisiche e le continuazioni. L’algoritmo è deterministico: uno stesso input produce sempre lo stesso output e non utilizza rete, orologio, casualità, daemon Docker o stato dell’ambiente. È quindi adatto anche ai Dockerfile generati. Consideri il rapporto un semplice indicatore di manutenibilità, non una prova di sicurezza o compilabilità. Lo strumento non esegue comandi shell, non risolve variabili nei nomi delle immagini, non ispeziona pacchetti, non convalida le origini COPY, non impone un USER senza privilegi e non cerca vulnerabilità. Abbini questo controllo rapido a un vero build, alla scansione dell’immagine, alle regole aziendali e ai test del processo risultante. Se l’input contiene soltanto spazi o commenti, la richiesta fallisce perché non vi sono istruzioni Dockerfile da valutare.
Casi d'uso
Esamini un Dockerfile prima del commit
Individui riferimenti mutabili e directory di lavoro ambigue mentre sta ancora modificando le righe interessate.
Controlli le definizioni generate
Verifichi l’output dei template prima che la pipeline impieghi tempo per creare e pubblicare un’immagine.
Valuti un repository di container
Produca risultati coerenti con righe precise per dare priorità a semplici correzioni tra più servizi.
Domande frequenti
Quanto costa una richiesta di analisi?
Ogni richiesta API costa $0.002. Lei può anche usare direttamente la versione browser disponibile in questa pagina.
Un’immagine senza tag viene considerata latest?
Sì. Docker interpreta un tag omesso come latest; l’analizzatore consiglia quindi un tag versionato o un digest.
Lo strumento combina automaticamente le istruzioni RUN?
No. Segnala i RUN consecutivi senza riscriverli, poiché limiti di cache separati possono essere intenzionali.
Perché WORKDIR mancante viene indicato alla riga 1?
L’omissione riguarda tutto il file e non ha una propria riga; la riga 1 rappresenta quindi la posizione globale.
Questo strumento convalida sintassi o sicurezza?
No. Esegue tre controlli di base e va affiancato a build, regole e scansioni delle vulnerabilità.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo stack
curl -X POST https://api.kit.forhosting.com/dev2/dockerfile-lint-basic \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"FROM node:20-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci && npm cache clean --force\nCOPY . .\nCMD [\"node\", \"server.js\"]"}'const res = await fetch("https://api.kit.forhosting.com/dev2/dockerfile-lint-basic", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "FROM node:20-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci && npm cache clean --force\nCOPY . .\nCMD [\"node\", \"server.js\"]"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev2/dockerfile-lint-basic",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "FROM node:20-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci && npm cache clean --force\nCOPY . .\nCMD [\"node\", \"server.js\"]"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev2/dockerfile-lint-basic", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"FROM node:20-alpine\\nWORKDIR /app\\nCOPY package*.json ./\\nRUN npm ci && npm cache clean --force\\nCOPY . .\\nCMD [\\"node\\", \\"server.js\\"]"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"FROM node:20-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci && npm cache clean --force\nCOPY . .\nCMD [\"node\", \"server.js\"]"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev2/dockerfile-lint-basic", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Esempio di richiesta
{
"text": "FROM node:20-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci && npm cache clean --force\nCOPY . .\nCMD [\"node\", \"server.js\"]"
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.dockerfile_lint_basic",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |