| --- |
| language: "code" |
| license: "mit" |
| tags: |
| - dockerfile |
| - hadolint |
| - binary-classification |
| - codebert |
| model-index: |
| - name: Binary Dockerfile Classifier |
| results: [] |
| --- |
| |
|
|
| # π§± Dockerfile Quality Classifier β Binary Model |
|
|
| This model predicts whether a given Dockerfile is: |
|
|
| - β
**GOOD** β clean and adheres to best practices (no top rule violations) |
| - β **BAD** β violates at least one important rule (from Hadolint) |
|
|
| It is the first step in a full ML-based Dockerfile linter. |
|
|
| --- |
|
|
| ## π§ Model Overview |
|
|
| - **Architecture:** Fine-tuned `microsoft/codebert-base` |
| - **Task:** Binary classification (`good` vs `bad`) |
| - **Input:** Full Dockerfile content as plain text |
| - **Output:** `[prob_good, prob_bad]` β softmax scores |
| - **Max input length:** 512 tokens |
|
|
| --- |
|
|
| ## π Training Details |
|
|
| - **Data source:** Real-world and synthetic Dockerfiles |
| - **Labels:** Based on [Hadolint](https://github.com/hadolint/hadolint) top 30 rules |
| - **Bad examples:** At least one rule violated |
| - **Good examples:** Fully clean files |
| - **Dataset balance:** 15000 BAD / 1500 GOOD (clean) |
|
|
| --- |
|
|
| ## π§ͺ Evaluation Results |
|
|
| Evaluation on a held-out test set of 1,650 Dockerfiles: |
|
|
| | Class | Precision | Recall | F1-score | Support | |
| |-------|-----------|--------|----------|---------| |
| | good | 0.96 | 0.91 | 0.93 | 150 | |
| | bad | 0.99 | 1.00 | 0.99 | 1500 | |
| | **Accuracy** | | | **0.99** | 1650 | |
|
|
| --- |
|
|
| ## π Quick Start |
|
|
| ### π§ͺ Step 1 β Create test script |
|
|
| Save this as `test_binary_predict.py`: |
|
|
| ```python |
| import sys |
| from transformers import AutoTokenizer, AutoModelForSequenceClassification |
| import torch |
| from pathlib import Path |
| |
| path = Path(sys.argv[1]) |
| text = path.read_text(encoding="utf-8") |
| |
| tokenizer = AutoTokenizer.from_pretrained("LeeSek/binary-dockerfile-model") |
| model = AutoModelForSequenceClassification.from_pretrained("LeeSek/binary-dockerfile-model") |
| model.eval() |
| |
| inputs = tokenizer(text, return_tensors="pt", padding="max_length", truncation=True, max_length=512) |
| |
| with torch.no_grad(): |
| logits = model(**inputs).logits |
| probs = torch.nn.functional.softmax(logits, dim=1).squeeze() |
| |
| label = "GOOD" if torch.argmax(probs).item() == 0 else "BAD" |
| print(f"Prediction: {label} β Probabilities: good={probs[0]:.3f}, bad={probs[1]:.3f}") |
| ``` |
|
|
| --- |
|
|
| ### π Step 2 β Create good and bad Dockerfile |
|
|
| Good: |
|
|
| ```docker |
| FROM node:18 |
| WORKDIR /app |
| COPY . . |
| RUN npm install |
| CMD ["node", "index.js"] |
| ``` |
|
|
| Bad: |
|
|
| ```docker |
| FROM ubuntu:latest |
| RUN apt-get install python3 |
| ADD . /app |
| WORKDIR /app |
| RUN pip install flask |
| CMD python3 app.py |
| ``` |
|
|
| --- |
|
|
| ### βΆοΈ Step 3 β Run the prediction |
|
|
| ```bash |
| python test_binary_predict.py Dockerfile |
| ``` |
|
|
| Expected output: |
|
|
| ``` |
| Prediction: GOOD β Probabilities: good=0.998, bad=0.002 |
| ``` |
|
|
| --- |
|
|
| ## π Extras |
|
|
| The full training and evaluation pipeline β including data preparation, training, validation, prediction β is available in the **`scripts/`** folder. |
|
|
| > π¬ **Note:** Scripts are written with **Polish comments and variable names** for clarity during local development. Logic is fully portable. |
|
|
| --- |
|
|
| ## π License |
|
|
| MIT |
|
|
| --- |
|
|
| ## π Credits |
|
|
| - Model powered by [Hugging Face Transformers](https://huggingface.co/transformers) |
| - Tokenizer: CodeBERT |
| - Rule definitions: [Hadolint](https://github.com/hadolint/hadolint) |
|
|