Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions РукосуеваЕД/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*.sh text eol=lf
16 changes: 16 additions & 0 deletions РукосуеваЕД/Dockerfile
Original file line number Diff line number Diff line change
@@ -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"]
84 changes: 84 additions & 0 deletions РукосуеваЕД/README.md
Original file line number Diff line number Diff line change
@@ -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`.
87 changes: 87 additions & 0 deletions РукосуеваЕД/run.sh
Original file line number Diff line number Diff line change
@@ -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 <CONTAINER_NAME> bash)."