From cc00d75bad169047f180b48d2faf7ae9003afbcd Mon Sep 17 00:00:00 2001 From: kir1903 Date: Wed, 9 Sep 2026 19:32:42 +0700 Subject: [PATCH] =?UTF-8?q?104.=20Docker:=20=D0=A0=D1=83=D0=BA=D0=BE=D1=81?= =?UTF-8?q?=D1=83=D0=B5=D0=B2=D0=B0=D0=95=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.gitattributes" | 1 + .../Dockerfile" | 16 ++++ .../README.md" | 84 ++++++++++++++++++ .../run.sh" | 87 +++++++++++++++++++ 4 files changed, 188 insertions(+) create mode 100644 "\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/.gitattributes" create mode 100644 "\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/Dockerfile" create mode 100644 "\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/README.md" create mode 100644 "\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/run.sh" diff --git "a/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/.gitattributes" "b/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/.gitattributes" new file mode 100644 index 0000000..dfdb8b7 --- /dev/null +++ "b/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/.gitattributes" @@ -0,0 +1 @@ +*.sh text eol=lf diff --git "a/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/Dockerfile" "b/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/Dockerfile" new file mode 100644 index 0000000..c7a1d9a --- /dev/null +++ "b/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/Dockerfile" @@ -0,0 +1,16 @@ +# Минимальный образ, как того требует задание 104 +FROM alpine:latest + +# Устанавливаем bash (в alpine его нет по умолчанию) и утилиты, +# которые нужны для выполнения дальнейших шагов задания +RUN apk update && apk add --no-cache bash coreutils file wget curl + +WORKDIR /root + +COPY run.sh /root/run.sh +RUN chmod +x /root/run.sh + +# При старте контейнера выполняем все шаги задания через bash, +# затем оставляем контейнер запущенным, чтобы можно было +# подключиться и проверить результат (docker exec -it CONTAINER_NAME bash) +CMD ["/bin/bash", "-c", "/root/run.sh; tail -f /dev/null"] diff --git "a/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/README.md" "b/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/README.md" new file mode 100644 index 0000000..72a984e --- /dev/null +++ "b/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/README.md" @@ -0,0 +1,84 @@ +# Лабораторная работа №104. Docker + +**Выполнила:** Рукосуева Е.Д. + +## Цель работы + +- Познакомиться с Docker. +- Изучить некоторые базовые команды Linux. + +## Ход работы + +Задание выполнено путём автоматизации всех требуемых шагов в скрипте +[`run.sh`](run.sh), который запускается внутри контейнера, собранного из +[`Dockerfile`](Dockerfile). Образ собирается на базе минимального образа +**alpine**, в котором отдельным шагом устанавливается **bash** (в alpine +он не входит в базовый образ), после чего все дальнейшие действия +выполняются именно в bash. + +Скрипт `run.sh` выполняет: + +1. Создание файла `РукосуеваЕД.txt` в домашнем каталоге (`~/`). +2. Вывод текущей даты и дня недели командой `date`. +3. Вывод расширенной информации о файле `/bin/bash` (`ls -l` и `file`). +4. Скачивание текста "Lewis Carroll. Alice's Adventures in Wonderland" + (`http://www.lib.ru/CARROLL/alice.txt`) командой `wget`/`curl` с + сохранением сразу под именем `alice.txt`. +5. Подсчёт количества слов в `alice.txt` командой `wc -w`. +6. Вывод первых 19 строк файла (`head -n 19`) и последних 17 строк + (`tail -n 17`). +7. Создание каталогов `test1`...`test40` (`mkdir`). +8. Удаление каталогов, номер которых оканчивается на `3` или `7` + (`rmdir`/`rm`). +9. Сохранение списка оставшихся каталогов в файл `test.txt` и вывод + количества строк в нём (`wc -l`). +10. Создание файла `date.txt` с текущей датой в формате `ГОД-МЕСЯЦ-ДЕНЬ` + в каталогах, номер которых кратен 5. +11. Дописывание текущего времени в `date.txt` в каталогах, номер которых + кратен 10. + +## Ответы на вопросы отчёта + +**Что представляет собой файл `/bin/bash`?** +Это исполняемый бинарный файл (ELF-файл) — сама программа командного +интерпретатора bash, а не текстовый скрипт и не симлинк. Команда +`file /bin/bash` показывает тип файла (динамически линкованный +исполняемый файл ELF для соответствующей архитектуры), а `ls -l /bin/bash` +— его права доступа, владельца и размер. + +**Какой день недели выводит команда `date`?** +Зависит от даты сборки/запуска контейнера — конкретное значение видно +в выводе `date` в логах контейнера (см. раздел "Как запустить" ниже). + +## Как запустить + +```bash +docker build -t rukosueva-docker-lab . +docker run --name docker-lab-104 rukosueva-docker-lab +``` + +Весь отчёт (вывод всех команд по шагам задания) печатается в stdout — +его можно посмотреть командой: + +```bash +docker logs docker-lab-104 +``` + +Контейнер после выполнения скрипта не завершается, поэтому созданные +файлы и каталоги можно проверить, подключившись к нему: + +```bash +docker exec -it docker-lab-104 bash +ls ~/ +cat ~/test.txt +``` + +## Выводы + +В ходе выполнения работы были изучены базовые принципы работы с Docker: +сборка образа на основе минимального базового образа (alpine), +автоматизация установки пакетов и выполнения команд внутри контейнера +через Dockerfile и shell-скрипт. Также закреплены базовые команды Linux +для работы с файлами и каталогами: `date`, `file`, `wget`/`curl`, `wc`, +`head`, `tail`, `mkdir`, `rmdir`/`rm`, перенаправление вывода (`>`, `>>`) +и работа с массовыми операциями над каталогами в цикле `for`. diff --git "a/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/run.sh" "b/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/run.sh" new file mode 100644 index 0000000..33beb21 --- /dev/null +++ "b/\320\240\321\203\320\272\320\276\321\201\321\203\320\265\320\262\320\260\320\225\320\224/run.sh" @@ -0,0 +1,87 @@ +#!/bin/bash +# Скрипт автоматизирует все шаги задания 104 (Docker) и печатает отчёт в stdout. +set -euo pipefail + +cd ~ + +section() { + echo + echo "===== $1 =====" +} + +section "Шаг 4: создание файла РукосуеваЕД.txt в домашнем каталоге" +touch РукосуеваЕД.txt +ls -la ~/РукосуеваЕД.txt + +section "Шаг 4: команда date — текущий день недели" +date +echo "День недели: $(date +%A)" + +section "Шаг 5: расширенная информация о файле /bin/bash" +ls -l /bin/bash +file /bin/bash + +section "Шаг 6-7: скачивание Alice's Adventures in Wonderland и переименование в alice.txt" +wget -q -O alice.txt "http://www.lib.ru/CARROLL/alice.txt" || curl -fsSL -o alice.txt "http://www.lib.ru/CARROLL/alice.txt" +ls -la alice.txt + +section "Шаг 8: количество слов в alice.txt (wc -w)" +wc -w < alice.txt + +section "Шаг 9: первые 19 строк alice.txt (head -n 19)" +head -n 19 alice.txt + +section "Шаг 10: последние 17 строк alice.txt (tail -n 17)" +tail -n 17 alice.txt + +section "Шаг 11: создание каталогов test1..test40" +for i in $(seq 1 40); do + mkdir -p "test$i" +done +echo "Создано каталогов: $(ls -d test*/ | wc -l)" + +section "Шаг 12: удаление каталогов, оканчивающихся на 3 и 7" +for i in $(seq 1 40); do + case "$i" in + *3|*7) + rmdir "test$i" 2>/dev/null || rm -rf "test$i" + ;; + esac +done +echo "Осталось каталогов: $(ls -d test*/ | wc -l)" + +section "Шаг 13: список каталогов -> test.txt" +ls -d test*/ > test.txt +cat test.txt + +section "Шаг 14: количество строк в test.txt (wc -l)" +wc -l < test.txt + +section "Шаг 15: date.txt (формат ГОД-МЕСЯЦ-ДЕНЬ) в каталогах, номер которых кратен 5" +for d in test*/; do + num="${d%/}" + num="${num#test}" + if (( num % 5 == 0 )); then + date +"%Y-%m-%d" > "$d/date.txt" + fi +done + +section "Шаг 16: дописать текущее время в date.txt в каталогах, номер которых кратен 10" +for d in test*/; do + num="${d%/}" + num="${num#test}" + if (( num % 10 == 0 )); then + date +"%H:%M:%S" >> "$d/date.txt" + fi +done + +section "Итог: содержимое созданных date.txt" +for d in test*/; do + if [[ -f "$d/date.txt" ]]; then + echo "--- $d date.txt ---" + cat "$d/date.txt" + fi +done + +section "Готово" +echo "Все шаги задания выполнены. Контейнер остаётся запущенным для проверки (docker exec -it bash)."