feat(L08): add Docker fundamentals card
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"$schema": "../../../../tools/card-layouts/schemas/card-source.schema.json",
|
||||
"schema": "esc-card-source.v1",
|
||||
"card": {
|
||||
"id": "mpabi-inf-console-bash-08-docker",
|
||||
"series": "console-bash",
|
||||
"series_title": "Bash · Console Tools",
|
||||
"number": "08",
|
||||
"count": "08",
|
||||
"slug": "docker",
|
||||
"title": "L08 · Docker Fundamentals — image, container and storage",
|
||||
"topic": "Obraz, cykl życia kontenera, volume i bind mount",
|
||||
"project": "Warsztat terminalowy",
|
||||
"subject": "Informatyka",
|
||||
"level": "Rok 1 · Console",
|
||||
"revision_date": "2026-07-21T00:00:00+02:00",
|
||||
"status": "Gotowa do wykonania",
|
||||
"version": "v00.01",
|
||||
"uuid": "b6d3b00d-6912-502d-95d7-3ee47c60f1db",
|
||||
"author": "M. Pabiszczak",
|
||||
"year": "2026"
|
||||
},
|
||||
"generated": {"tex": "doc/generated/main.tex", "html": "web/index.html", "html_css": "web/style.css", "react_app": true, "html_tree_inspector": false},
|
||||
"template": "templates/karta-klasyczna.json",
|
||||
"title_block": {
|
||||
"category": "KARTA PRACY · INFORMATYKA · CONSOLE",
|
||||
"standard": "ISO 7200",
|
||||
"prepared_by": "M. Pabiszczak",
|
||||
"prepared_on": "21.07.2026",
|
||||
"checked_by": "testy automatyczne",
|
||||
"approved_by": "—",
|
||||
"url": "http://localhost:8080",
|
||||
"repository_url": "https://gitea.local/edu-inf/lab-console-docker",
|
||||
"revision": "1",
|
||||
"issued_on": "21.07.2026",
|
||||
"series": "CONSOLE-BASH-08",
|
||||
"document_type": "karta pracy",
|
||||
"tool": "card-layouts",
|
||||
"sheet": "1 / 1",
|
||||
"show_qr": false,
|
||||
"show_repository_qr": false,
|
||||
"height_cm": 3,
|
||||
"repeat_on_every_page": true,
|
||||
"replace_front_matter": true
|
||||
},
|
||||
"front_page_scope": {
|
||||
"title": "Cel karty",
|
||||
"content_tex": "Uczeń rozróżnia image od container, przeprowadza cykl życia oraz wyjaśnia trwałość volume i bind mount. Test automatyczny działa jako jawny model offline i nie oznacza uruchomienia prawdziwego silnika.",
|
||||
"scope_title": "Zakres tasków",
|
||||
"scope_table": {
|
||||
"headers": ["Krok", "Numer tasku", "Najważniejsza idea", "Priorytet", "Status", "Version"],
|
||||
"rows": [
|
||||
{"chapter": "8", "task": "Task01", "idea_tex": "Dockerfile, build, tag i digest", "priority": "obowiązkowe", "status": "ready", "version": "v00.01"},
|
||||
{"chapter": "8", "task": "Task02", "idea_tex": "running, exited, removed", "priority": "obowiązkowe", "status": "ready", "version": "v00.01"},
|
||||
{"chapter": "8", "task": "Task03", "idea_tex": "volume i bind mount", "priority": "obowiązkowe", "status": "ready", "version": "v00.01"}
|
||||
]
|
||||
}
|
||||
},
|
||||
"learning_effects": {
|
||||
"CB08.EN01": {"text": "Uczeń analizuje relację Dockerfile, image, tagu i digestu.", "label": "Image specification", "bloom_level": "Analiza", "assessment_criteria": ["CB08.KW01"]},
|
||||
"CB08.EK01": {"text": "Uczeń przeprowadza cykl życia kontenera i rozróżnia mechanizmy trwałych danych.", "label": "Lifecycle and storage", "bloom_level": "Zastosowanie", "assessment_criteria": ["CB08.KW01"]}
|
||||
},
|
||||
"assessment_criteria": {
|
||||
"CB08.KW01": {"text": "Poprawna specyfikacja image, przejścia running–exited–removed oraz trwałość volume i bind są potwierdzone; tryb offline i brak socketu są jawne.", "learning_effects": ["CB08.EN01", "CB08.EK01"]}
|
||||
},
|
||||
"educational_requirements": {
|
||||
"CB08.WE01": {
|
||||
"text": "Bezpieczny model podstaw konteneryzacji.",
|
||||
"label": "Image, container i storage",
|
||||
"learning_effects": ["CB08.EN01", "CB08.EK01"],
|
||||
"learning_tree": {
|
||||
"schema": "we-learning-tree.v1",
|
||||
"policy": "Profil ucznia nie otrzymuje socketu engine. Automatyczny PASS pochodzi z audytowalnego modelu offline i nie jest przedstawiany jako rzeczywiste wykonanie Docker/Podman.",
|
||||
"ogolne": [{"tree_id": "CB08.WE01.OG.IP.01", "effect_ref": "CB08.EN01", "display": "EN IP CB08.01", "text": "Uczeń analizuje niezmienną specyfikację image.", "kw": [{"criterion_ref": "CB08.KW01", "display": "KW IP CB08.01", "text": "Wyjaśnia różnicę między tagiem i digestem."}]}],
|
||||
"zawodowe": [{"tree_id": "CB08.WE01.TECH.I4.01", "effect_ref": "CB08.EK01", "display": "EK INF04 CB08.01", "text": "Uczeń modeluje cykl życia i storage.", "kw": [{"criterion_ref": "CB08.KW01", "display": "KW INF04 CB08.01", "text": "Potwierdza stany i niezależność danych."}]}]
|
||||
}
|
||||
}
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"title": "Task01 · Zbuduj specyfikację image",
|
||||
"content_kind": "prose",
|
||||
"content_tex": "Przygotuj minimalny Dockerfile, sprawdź cztery instrukcje i wylicz stabilny digest kontekstu. Tag jest nazwą, digest identyfikatorem treści.",
|
||||
"educational_requirement_refs": ["CB08.WE01"], "learning_effect_refs": ["CB08.EN01", "CB08.EK01"], "assessment_criterion_refs": ["CB08.KW01"], "area_tree_refs": ["CB08.WE01.OG.IP.01", "CB08.WE01.TECH.I4.01"],
|
||||
"steps": [{"id": "T01-IMAGE", "title": "Potwierdź składnię, 4 instrukcje, digest i offline-model.", "tree_refs": ["CB08.WE01.OG.IP.01"]}],
|
||||
"assets": [{"path": "assets/docker-model.png", "html_path": "assets/docker-model.svg", "caption": "Image jest specyfikacją; kontener ma własny cykl życia, a dane mogą żyć niezależnie.", "label": "fig:docker-model", "alt": "Diagram Dockerfile, image, container, volume i bind mount.", "kind": "diagram", "width": 0.72}]
|
||||
},
|
||||
{
|
||||
"title": "Task02 · Cykl życia kontenera",
|
||||
"content_kind": "prose",
|
||||
"content_tex": "Uruchom instancję image, odczytaj stan running, zatrzymaj ją do exited, a następnie usuń. Stop nie jest tym samym co rm.",
|
||||
"educational_requirement_refs": ["CB08.WE01"], "learning_effect_refs": ["CB08.EN01", "CB08.EK01"], "assessment_criterion_refs": ["CB08.KW01"], "area_tree_refs": ["CB08.WE01.OG.IP.01", "CB08.WE01.TECH.I4.01"],
|
||||
"steps": [{"id": "T02-LIFECYCLE", "title": "Zmierz running, exited i removed.", "tree_refs": ["CB08.WE01.TECH.I4.01"]}]
|
||||
},
|
||||
{
|
||||
"title": "Task03 · Volume i bind mount",
|
||||
"content_kind": "prose",
|
||||
"content_tex": "Zapisz dane w nazwanym volume i ścieżce bind. Po usunięciu kontenera oba zasoby pozostają; volume usuwa się osobno, a bind pozostaje własnością hosta.",
|
||||
"educational_requirement_refs": ["CB08.WE01"], "learning_effect_refs": ["CB08.EN01", "CB08.EK01"], "assessment_criterion_refs": ["CB08.KW01"], "area_tree_refs": ["CB08.WE01.OG.IP.01", "CB08.WE01.TECH.I4.01"],
|
||||
"steps": [{"id": "T03-STORAGE", "title": "Potwierdź trwałość i jawne usunięcie volume; zapisz trace.log.", "tree_refs": ["CB08.WE01.TECH.I4.01"]}]
|
||||
}
|
||||
],
|
||||
"tasks": {
|
||||
"task01": {"prompt_tex": "Zbuduj specyfikację image z Dockerfile.", "criterion": "syntax=valid instructions=4 digest=sha256:* engine=offline-model socket_exposed=0", "assessment_criterion_ref": "CB08.KW01"},
|
||||
"task02": {"prompt_tex": "Przeprowadź cykl życia kontenera.", "criterion": "running=1 inspected=running stopped=exited removed=1 engine=offline-model", "assessment_criterion_ref": "CB08.KW01"},
|
||||
"task03": {"prompt_tex": "Porównaj trwałość volume i bind mount.", "criterion": "volume_persists_after_container_rm=1 bind_persists=1 volume_removed_explicitly=1", "assessment_criterion_ref": "CB08.KW01"}
|
||||
},
|
||||
"tasks_order": ["task01", "task02", "task03"],
|
||||
"mission": "Zrozumieć image, container i storage bez udostępniania uczniowi uprzywilejowanego socketu.",
|
||||
"objectives": ["Wyjaśnisz tag i digest.", "Przeprowadzisz cykl życia kontenera.", "Rozróżnisz volume i bind mount."],
|
||||
"agenda": [{"time": "0--20 min", "work": "Dockerfile i image."}, {"time": "20--40 min", "work": "Cykl życia."}, {"time": "40--65 min", "work": "Storage, granica bezpieczeństwa i trace."}],
|
||||
"tech_stack": {"software": [{"name": "container_lab.py", "use": "jawny model stanów offline"}, {"name": "POSIX shell", "use": "izolowane scenariusze"}, {"name": "stemctl", "use": "profil native-amd64"}], "hardware": [{"name": "Brak socketu engine", "use": "celowa granica profilu ucznia"}]},
|
||||
"container_test": {
|
||||
"title": "Test native-amd64",
|
||||
"commands": ["stemctl test native-amd64 console-bash L08 1", "stemctl test native-amd64 console-bash L08 2", "stemctl debug native-amd64 console-bash L08 3"],
|
||||
"pass_condition": "Trzy komunikaty PASS z engine=offline-model, socket_exposed=0 oraz trace.log; nie oznacza uruchomienia prawdziwego silnika."
|
||||
},
|
||||
"safety_rules": [
|
||||
{"title": "Bez socketu silnika", "body": "Nie montuj /var/run/docker.sock ani socketu Podman do profilu ucznia."},
|
||||
{"title": "Uczciwy dowód", "body": "PASS modelu offline nie jest dowodem rzeczywistego wykonania Docker/Podman."},
|
||||
{"title": "Izolacja", "body": "Stan modelu i dane powstają wyłącznie w katalogu mktemp."}
|
||||
],
|
||||
"hardware_procedure": [{"step": "1", "action": "Zbuduj specyfikację.", "condition": "4 instrukcje i stabilny digest."}, {"step": "2", "action": "Przeprowadź lifecycle.", "condition": "running, exited, removed."}, {"step": "3", "action": "Sprawdź storage.", "condition": "Dane przetrwały rm kontenera."}],
|
||||
"references": []
|
||||
}
|
||||
Reference in New Issue
Block a user