Files
2026-07-21 18:20:10 +02:00

126 lines
8.8 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"$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 runningexitedremoved 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": []
}