diff --git a/kashin_maxim_lab_2/.gitignore b/kashin_maxim_lab_2/.gitignore new file mode 100644 index 0000000..cef5ae5 --- /dev/null +++ b/kashin_maxim_lab_2/.gitignore @@ -0,0 +1 @@ +var/ \ No newline at end of file diff --git a/kashin_maxim_lab_2/README.md b/kashin_maxim_lab_2/README.md new file mode 100644 index 0000000..bed4a4a --- /dev/null +++ b/kashin_maxim_lab_2/README.md @@ -0,0 +1,60 @@ +# Кашин Максим ПИбд-42 + +## Описание + +Этот проект состоит из трех отдельных программ, каждая из которых находится в своей папке (`program_0`, `program_1`, `program_2`). Каждая программа запускается в отдельном Docker-контейнере и взаимодействует с другими через общие директории, примонтированные как тома (volumes). Для управления контейнерами используется `docker-compose`. + +### Основная структура: +- **program_0**: выполняет подготовку для выполнение задач (генерация файлов) и сохраняет результат в директорию `./var/data`. +- **program_1**: использует данные из `./var/data`, генерируемые `program_0`, обрабатывает их и сохраняет результат в `./var/result`. +- **program_2**: берет результаты из `./var/result`, созданные `program_1`, и выполняет заключительную часть обработки и сохраняет результат в `./var/result`. + + +### Шаги для запуска + +1. **Запуск всех сервисов:** + + Для запуска всех программ с помощью Docker Compose, выполните следующую команду: + + ```bash + docker-compose up --build + ``` + + Это создаст и запустит все три программы в последовательности. + +2. **Работа с томами:** + + Проект использует два общих тома для обмена данными между программами: + + - `/var/data`: программа `program_0` сохраняет туда свои данные, которые потом читает `program_1`. + - `/var/result`: программа `program_1` сохраняет результаты обработки, которые затем используются в `program_2`. + +3. **Остановка сервисов:** + + Для остановки всех контейнеров выполните команду: + + ```bash + docker-compose down + ``` + +## Структура проекта + +- **program_0/**: + - `main.py`: основной код для первой программы (генерация файлов). + - `Dockerfile`: инструкция по созданию Docker-образа для `program_0`. + +- **program_1/**: + - `main.py`: основной код для второй программы (Скрипт на задание 1.3 - Формирует файл /var/result/data.txt так, что каждая строка файла - количество строк в файлах из каталога /var/data.) + - `Dockerfile`: инструкция по созданию Docker-образа для `program_1`. + +- **program_2/**: + - `main.py`: основной код для третьей программы (Скрипт на задание 2.1 - Ищет набольшее число из файла /var/result/data.txt и сохраняет его вторую степень в /var/result/result.txt.) + - `Dockerfile`: инструкция по созданию Docker-образа для `program_2`. + +- **docker-compose.yml**: конфигурация для Docker Compose, описывающая, как собирать и запускать все контейнеры, а также тома, которые они используют. + +- **.gitignore**: файл для исключения директории `var/` (временных данных и результатов). + +### Видео-отчёт + +- [Видео отчёт Кашин Максим ПИбд-42](https://disk.yandex.ru/i/NGZD2HkmZkIBww) \ No newline at end of file diff --git a/kashin_maxim_lab_2/docker-compose.yml b/kashin_maxim_lab_2/docker-compose.yml new file mode 100644 index 0000000..e4d9fe7 --- /dev/null +++ b/kashin_maxim_lab_2/docker-compose.yml @@ -0,0 +1,24 @@ +services: + + program_0: + build: + context: ./program_0 # Контекст сборки для контейнера program_0, указывающий на папку с Dockerfile + volumes: + - ./var/data:/data # Монтирование локальной директории ./var/data в контейнер по пути /data + + program_1: + build: + context: ./program_1 # Контекст сборки для контейнера program_1, указывающий на папку с Dockerfile + volumes: + - ./var/data:/data # Монтирование локальной директории ./var/data в контейнер по пути /data + - ./var/result:/result # Монтирование локальной директории ./var/result в контейнер по пути /result + depends_on: + - program_0 # Зависимость от program_0; program_1 не будет запущен до завершения program_0 + + program_2: + build: + context: ./program_2 # Контекст сборки для контейнера program_2, указывающий на папку с Dockerfile + volumes: + - ./var/result:/result # Монтирование локальной директории ./var/result в контейнер по пути /result + depends_on: + - program_1 # Зависимость от program_1; program_2 не будет запущен до завершения program_1 diff --git a/kashin_maxim_lab_2/program_0/Dockerfile b/kashin_maxim_lab_2/program_0/Dockerfile new file mode 100644 index 0000000..1499f65 --- /dev/null +++ b/kashin_maxim_lab_2/program_0/Dockerfile @@ -0,0 +1,11 @@ +# Используем базовый образ Python версии 3.12 с минимальным размером +FROM python:3.12-slim + +# Устанавливаем рабочую директорию внутри контейнера +WORKDIR /program_0 + +# Копируем файл main.py из локальной файловой системы в рабочую директорию контейнера +COPY main.py /program_0/ + +# Определяем команду, которая будет выполняться при запуске контейнера +CMD ["python", "main.py"] diff --git a/kashin_maxim_lab_2/program_0/main.py b/kashin_maxim_lab_2/program_0/main.py new file mode 100644 index 0000000..f18b38d --- /dev/null +++ b/kashin_maxim_lab_2/program_0/main.py @@ -0,0 +1,53 @@ +import random +import os + +# Путь к папке, где будут создаваться файлы +folder_path = '/data' + +# Функция для создания папки, если она не существует +def creat_folder(): + if not os.path.exists(folder_path): + os.makedirs(folder_path) + print(f"Папка `{folder_path}` создана!") + else: + print(f"Папка `{folder_path}` уже существует!") + +# Функция для удаления всех файлов в папке +def delete_files_in_folder(): + for filename in os.listdir(folder_path): + file_path = os.path.join(folder_path, filename) + try: + if os.path.isfile(file_path): + os.remove(file_path) + print(f"Файл `{file_path}` удален.") + except Exception as e: + print(f'Ошибка при удалении файла {file_path}. {e}') + +# Функция для создания файлов с случайными данными +def creat_file(): + # Создаем случайное количество файлов (от 10 до 20) + for i in range(random.randrange(10, 20)): + file = open(f'{folder_path}/file_{i}.txt', 'w+') + print(f"Создан файл: {folder_path}/file_{i}.txt") + # Заполняем файл случайным количеством строк (от 10 до 50) + for i in range(random.randrange(10, 50)): + file.write(f'{create_lines()} \n') # Записываем строку данных в файл + file.close() + +# Функция для создания случайных числовых строк +def create_lines(): + # Создаем список случайных чисел + lines = [i for i in range(random.randrange(1, 50), random.randrange(50, 100), random.randrange(1, 10))] + return lines + +# Основная логика: проверка существования папки и выполнение операций +if os.path.exists(folder_path): + print(f"Папка `{folder_path}` существует, удаляем старые файлы...") + delete_files_in_folder() + creat_file() +else: + print(f"Папка `{folder_path}` не существует, создаем...") + creat_folder() + creat_file() + +print("Скрипт на создание файлов выполнен.") diff --git a/kashin_maxim_lab_2/program_1/Dockerfile b/kashin_maxim_lab_2/program_1/Dockerfile new file mode 100644 index 0000000..7f8fac0 --- /dev/null +++ b/kashin_maxim_lab_2/program_1/Dockerfile @@ -0,0 +1,11 @@ +# Используем базовый образ Python версии 3.12 с минимальным размером +FROM python:3.12-slim + +# Устанавливаем рабочую директорию внутри контейнера +WORKDIR /program_1 + +# Копируем файл main.py из локальной файловой системы в рабочую директорию контейнера +COPY main.py /program_1/ + +# Определяем команду, которая будет выполняться при запуске контейнера +CMD ["python", "main.py"] \ No newline at end of file diff --git a/kashin_maxim_lab_2/program_1/main.py b/kashin_maxim_lab_2/program_1/main.py new file mode 100644 index 0000000..dbf48cb --- /dev/null +++ b/kashin_maxim_lab_2/program_1/main.py @@ -0,0 +1,58 @@ +from pathlib import Path +import os + +# Путь к папке, где будут создаваться файлы +folder_path = '/result' +# Путь к папке, где созданы файлы +folder_generator = '/data' + +# Функция для создания папки, если она не существует +def creat_folder(): + if not os.path.exists(folder_path): + os.makedirs(folder_path) + print(f"Папка `{folder_path}` создана!") + else: + print(f"Папка `{folder_path}` уже существует!") + +# Функция для удаления всех файлов в папке +def delete_files_in_folder(): + for filename in os.listdir(folder_path): + file_path = os.path.join(folder_path, filename) + try: + if os.path.isfile(file_path): + os.remove(file_path) + print(f"Файл `{file_path}` удален.") + except Exception as e: + print(f'Ошибка при удалении файла {file_path}. {e}') + +# Функция для создания файлов +def creat_file(): + file = open(f'{folder_path}/data.txt', 'w+') + print(f"Создан файл: {folder_path}/data.txt") + for count in files_count(): + file.write(f'{count} \n') + file.close() + +# Функция для подсчета количества строк в файлах +def files_count(): + files = [] + files_count = [] + files += os.listdir(folder_generator) + for file in files: + line_count = sum(1 for line in open(folder_generator + '/' + file)) + files_count.append(line_count) + print(f"Файл {file} имеет {line_count} количество строк") + return files_count + + +# Основная логика: проверка существования папки и выполнение операций +if os.path.exists(folder_path): + print(f"Папка `{folder_path}` существует, удаляем старые файлы...") + delete_files_in_folder() + creat_file() +else: + print(f"Папка `{folder_path}` не существует, создаем...") + creat_folder() + creat_file() + +print("Скрипт на задание 1.3 (Формирует файл /var/result/data.txt так, что каждая строка файла - количество строк в файлах из каталога /var/data.) выполнен.") diff --git a/kashin_maxim_lab_2/program_2/Dockerfile b/kashin_maxim_lab_2/program_2/Dockerfile new file mode 100644 index 0000000..5b180df --- /dev/null +++ b/kashin_maxim_lab_2/program_2/Dockerfile @@ -0,0 +1,11 @@ +# Используем базовый образ Python версии 3.12 с минимальным размером +FROM python:3.12-slim + +# Устанавливаем рабочую директорию внутри контейнера +WORKDIR /program_2 + +# Копируем файл main.py из локальной файловой системы в рабочую директорию контейнера +COPY main.py /program_2/ + +# Определяем команду, которая будет выполняться при запуске контейнера +CMD ["python", "main.py"] \ No newline at end of file diff --git a/kashin_maxim_lab_2/program_2/main.py b/kashin_maxim_lab_2/program_2/main.py new file mode 100644 index 0000000..b0166c3 --- /dev/null +++ b/kashin_maxim_lab_2/program_2/main.py @@ -0,0 +1,53 @@ +from pathlib import Path +import os + +# Путь к папке, где будут создаваться файлы +folder_path = '/result' + +# Функция для создания папки, если она не существует +def creat_folder(): + if not os.path.exists(folder_path): + os.makedirs(folder_path) + print(f"Папка `{folder_path}` создана!") + else: + print(f"Папка `{folder_path}` уже существует!") + +# Функция для удаления всех файлов в папке +def delete_files_in_folder(): + for filename in 'result.txt': + file_path = os.path.join(folder_path, filename) + try: + if os.path.isfile(file_path): + os.remove(file_path) + print(f"Файл `{file_path}` удален.") + except Exception as e: + print(f'Ошибка при удалении файла {file_path}. {e}') + +# Функция для создания файлов +def creat_file(): + file = open(f'{folder_path}/result.txt', 'w+') + print(f"Создан файл: {folder_path}/result.txt") + file.write(f'{max_nubmer_file()**2}') + print(f"Максимальное число: {max_nubmer_file()}") + print(f"Максимальное число в степени 2: {max_nubmer_file()**2}") + file.close() + +# Функция для посчёта максимального числа в файле +def max_nubmer_file(): + max_number = 0 + for line in open(f'{folder_path}/data.txt'): + if int(line) > max_number: + max_number = int(line) + return max_number + +# Основная логика: проверка существования папки и выполнение операций +if os.path.exists(folder_path): + print(f"Папка `{folder_path}` существует, удаляем старые файлы...") + delete_files_in_folder() + creat_file() +else: + print(f"Папка `{folder_path}` не существует, создаем...") + creat_folder() + creat_file() + +print("Скрипт на задание 2.1 (Ищет набольшее число из файла /var/result/data.txt и сохраняет его вторую степень в /var/result/result.txt.) выполнен.")