diff --git a/kashin_maxim_lab_2/README.md b/kashin_maxim_lab_2/README.md index 8c9a827..bed4a4a 100644 --- a/kashin_maxim_lab_2/README.md +++ b/kashin_maxim_lab_2/README.md @@ -1 +1,60 @@ -Тут будет отчёт \ No newline at end of file +# Кашин Максим ПИбд-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 index 7d6813c..e4d9fe7 100644 --- a/kashin_maxim_lab_2/docker-compose.yml +++ b/kashin_maxim_lab_2/docker-compose.yml @@ -2,23 +2,23 @@ services: program_0: build: - context: ./program_0 + context: ./program_0 # Контекст сборки для контейнера program_0, указывающий на папку с Dockerfile volumes: - - ./var/data:/data + - ./var/data:/data # Монтирование локальной директории ./var/data в контейнер по пути /data program_1: build: - context: ./program_1 + context: ./program_1 # Контекст сборки для контейнера program_1, указывающий на папку с Dockerfile volumes: - - ./var/data:/data - - ./var/result:/result + - ./var/data:/data # Монтирование локальной директории ./var/data в контейнер по пути /data + - ./var/result:/result # Монтирование локальной директории ./var/result в контейнер по пути /result depends_on: - - program_0 + - program_0 # Зависимость от program_0; program_1 не будет запущен до завершения program_0 program_2: build: - context: ./program_2 + context: ./program_2 # Контекст сборки для контейнера program_2, указывающий на папку с Dockerfile volumes: - - ./var/result:/result + - ./var/result:/result # Монтирование локальной директории ./var/result в контейнер по пути /result depends_on: - - program_1 \ No newline at end of file + - 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 index bccadfc..1499f65 100644 --- a/kashin_maxim_lab_2/program_0/Dockerfile +++ b/kashin_maxim_lab_2/program_0/Dockerfile @@ -1,7 +1,11 @@ +# Используем базовый образ Python версии 3.12 с минимальным размером FROM python:3.12-slim +# Устанавливаем рабочую директорию внутри контейнера WORKDIR /program_0 +# Копируем файл main.py из локальной файловой системы в рабочую директорию контейнера COPY main.py /program_0/ -CMD ["python", "main.py"] \ No newline at end of file +# Определяем команду, которая будет выполняться при запуске контейнера +CMD ["python", "main.py"] diff --git a/kashin_maxim_lab_2/program_0/main.py b/kashin_maxim_lab_2/program_0/main.py index 9bc8417..f18b38d 100644 --- a/kashin_maxim_lab_2/program_0/main.py +++ b/kashin_maxim_lab_2/program_0/main.py @@ -1,37 +1,46 @@ import random import os +# Путь к папке, где будут создаваться файлы folder_path = '/data' +# Функция для создания папки, если она не существует def creat_folder(): if not os.path.exists(folder_path): - os.makedirs(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) + 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.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() diff --git a/kashin_maxim_lab_2/program_1/Dockerfile b/kashin_maxim_lab_2/program_1/Dockerfile index bd44d1d..7f8fac0 100644 --- a/kashin_maxim_lab_2/program_1/Dockerfile +++ b/kashin_maxim_lab_2/program_1/Dockerfile @@ -1,7 +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 index fb87bfd..dbf48cb 100644 --- a/kashin_maxim_lab_2/program_1/main.py +++ b/kashin_maxim_lab_2/program_1/main.py @@ -1,9 +1,12 @@ 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) @@ -11,6 +14,7 @@ def creat_folder(): 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) @@ -21,6 +25,7 @@ def delete_files_in_folder(): 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") @@ -28,6 +33,7 @@ def creat_file(): file.write(f'{count} \n') file.close() +# Функция для подсчета количества строк в файлах def files_count(): files = [] files_count = [] @@ -39,7 +45,7 @@ def files_count(): return files_count - +# Основная логика: проверка существования папки и выполнение операций if os.path.exists(folder_path): print(f"Папка `{folder_path}` существует, удаляем старые файлы...") delete_files_in_folder() diff --git a/kashin_maxim_lab_2/program_2/Dockerfile b/kashin_maxim_lab_2/program_2/Dockerfile index d5e8b05..5b180df 100644 --- a/kashin_maxim_lab_2/program_2/Dockerfile +++ b/kashin_maxim_lab_2/program_2/Dockerfile @@ -1,7 +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 index 40a423a..b0166c3 100644 --- a/kashin_maxim_lab_2/program_2/main.py +++ b/kashin_maxim_lab_2/program_2/main.py @@ -1,8 +1,10 @@ from pathlib import Path import os +# Путь к папке, где будут создаваться файлы folder_path = '/result' +# Функция для создания папки, если она не существует def creat_folder(): if not os.path.exists(folder_path): os.makedirs(folder_path) @@ -10,6 +12,7 @@ def creat_folder(): else: print(f"Папка `{folder_path}` уже существует!") +# Функция для удаления всех файлов в папке def delete_files_in_folder(): for filename in 'result.txt': file_path = os.path.join(folder_path, filename) @@ -20,6 +23,7 @@ def delete_files_in_folder(): 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") @@ -28,6 +32,7 @@ def creat_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'): @@ -35,7 +40,7 @@ def max_nubmer_file(): max_number = int(line) return max_number - +# Основная логика: проверка существования папки и выполнение операций if os.path.exists(folder_path): print(f"Папка `{folder_path}` существует, удаляем старые файлы...") delete_files_in_folder()