diff --git a/minhasapov_ruslan_lab_2/.gitignore b/minhasapov_ruslan_lab_2/.gitignore new file mode 100644 index 0000000..d8adfc8 --- /dev/null +++ b/minhasapov_ruslan_lab_2/.gitignore @@ -0,0 +1,2 @@ +data +result \ No newline at end of file diff --git a/minhasapov_ruslan_lab_2/README.md b/minhasapov_ruslan_lab_2/README.md new file mode 100644 index 0000000..bedc1c0 --- /dev/null +++ b/minhasapov_ruslan_lab_2/README.md @@ -0,0 +1,49 @@ +# Лабораторная работа №2 +#### ПИбд-42. Минхасапов Руслан. + +--- + +#### Задание: +В рамках выполнения данной лабораторной работы были выбраны следущие варианты программ: +- Программа 1. Вариант 6: Берёт из каталога /var/data случайный файл и перекладывает его в /var/result/data.txt. +- Программа 2. Вариант 2: Ищет наименьшее число из файла /var/data/data.txt и сохраняет его третью степень в /var/result/result.txt. + +--- + +Исходя из условия задания: *разработать два приложения такие, что результат первого является исходными данными для второго*; - было принято решение для второй программы брать данные из файла */var/result/data.txt* + +Помимо этого, для выполнения первой программы, было решено генерировать файлы в ней же. + +--- + +#### При выполнении данной работы были использованы: +- Python 3.12 +- Docker +- Docker Compose + +--- + +#### Инструкция: +Для запуска необходимо перейдите в директорию *minhasapov_ruslan_lab_2* и выполнить команду: +``` +docker-compose up --build +``` + +--- + +#### Результат +``` +[+] Running 3/3 + ✔ Network minhasapov_ruslan_lab_2_default Created 0.1s + ✔ Container minhasapov_ruslan_lab_2-app_1-1 Created 0.2s + ✔ Container minhasapov_ruslan_lab_2-app_2-1 Created 0.1s +Attaching to app_1-1, app_2-1 +app_1-1 | В директории /var/data было создано 18 файлов. +app_1-1 | Случайно выбранный файл file_1.txt был скопирован в /var/result/data.txt. +app_2-1 | Куб минимального числа (37^3) = 50653 сохранен в /var/result/result.txt. +app_1-1 exited with code 0 +app_2-1 exited with code 0 +``` + +#### Видео-демонстрация работы +Доступна по [ссылке](https://disk.yandex.ru/i/Z7Kvlm8dpNSzXg) diff --git a/minhasapov_ruslan_lab_2/app_1/Dockerfile b/minhasapov_ruslan_lab_2/app_1/Dockerfile new file mode 100644 index 0000000..aaab8b8 --- /dev/null +++ b/minhasapov_ruslan_lab_2/app_1/Dockerfile @@ -0,0 +1,8 @@ +# Образ с Python 3.12 +FROM python:3.12 +# Указываем рабочую директорию +WORKDIR /app +# Копируем в нее файл скрипта +COPY app_1.py . +# Команда запуска скрипта +CMD ["python", "app_1.py"] \ No newline at end of file diff --git a/minhasapov_ruslan_lab_2/app_1/app_1.py b/minhasapov_ruslan_lab_2/app_1/app_1.py new file mode 100644 index 0000000..7a62cc3 --- /dev/null +++ b/minhasapov_ruslan_lab_2/app_1/app_1.py @@ -0,0 +1,70 @@ +import os +import random +import shutil + +# Директории +source_dir = "/var/data" # Путь к исходной директории +destination_dir = "/var/result" # Путь к директории назначения +destination_file = os.path.join(destination_dir, "data.txt") # Путь к файлу назначения + +# Генерация случайного количества файлов со случайными числами +def generate_random_files(directory): + # Создаем директорию, если она не существует, игнорируя ошибку, если она уже есть + os.makedirs(directory, exist_ok=True) + + # Генерируем случайное количество файлов + amount_files = random.randint(10, 20) + + # Создаем каждый файл + for i in range(1, amount_files + 1): + # Формируем путь к файлу + file_path = os.path.join(directory, f"file_{i}.txt") + + # Генерируем случайное количество чисел в файле + amount_numbers = random.randint(1, 100) + + # Генерируем список случайных чисел, преобразованных в строки + numbers = [str(random.randint(1, 100)) for _ in range(amount_numbers)] + + # Записываем числа в файл + with open(file_path, "w") as f: + f.write("\n".join(numbers)) + + print(f"В директории {directory} было создано {amount_files} файлов.") + +# Копирование случайного файла из исходной директории в файл +def copy_random_file(source_dir, destination_file): + # Создаем директорию назначения, если она не существует + os.makedirs(os.path.dirname(destination_file), exist_ok=True) + + # Получаем список файлов в исходной директории + files = [ + f + for f in os.listdir(source_dir) + if os.path.isfile(os.path.join(source_dir, f)) + ] + + # Проверяем, есть ли файлы в исходной директории + if not files: + print("В исходном каталоге нет файлов.") + return + + # Выбираем случайный файл из списка + random_file = random.choice(files) + + # Формируем путь к исходному файлу + source_path = os.path.join(source_dir, random_file) + + # Копируем выбранный файл в файл назначения + shutil.copy(source_path, destination_file) + + print(f"Случайно выбранный файл {random_file} был скопирован в {destination_file}.") + + +def main(): + generate_random_files(source_dir) + copy_random_file(source_dir, destination_file) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/minhasapov_ruslan_lab_2/app_2/Dockerfile b/minhasapov_ruslan_lab_2/app_2/Dockerfile new file mode 100644 index 0000000..5b52091 --- /dev/null +++ b/minhasapov_ruslan_lab_2/app_2/Dockerfile @@ -0,0 +1,8 @@ +# Образ с Python 3.12 +FROM python:3.12 +# Указываем рабочую директорию +WORKDIR /app +# Копируем в нее файл скрипта +COPY app_2.py . +# Команда запуска скрипта +CMD ["python", "app_2.py"] \ No newline at end of file diff --git a/minhasapov_ruslan_lab_2/app_2/app_2.py b/minhasapov_ruslan_lab_2/app_2/app_2.py new file mode 100644 index 0000000..ecf0998 --- /dev/null +++ b/minhasapov_ruslan_lab_2/app_2/app_2.py @@ -0,0 +1,36 @@ +import os + +# Пути к файлам +data_file = "/var/result/data.txt" +result_file = "/var/result/result.txt" + +def calculate_cube(data_file, result_file): + try: + # Открываем файл и считываем строки + with open(data_file, 'r') as f: + numbers = f.readlines() + + # Преобразуем строки в числа, игнорируя нечисловые значения + numbers = [int(num.strip()) for num in numbers if num.strip().isdigit()] + + if not numbers: + print("Файл не содержит чисел.") + return + + min_number = min(numbers) + cube = min_number ** 3 + + # Записываем результат в файл + with open(result_file, 'w') as f: + f.write(str(cube)) + + print(f"Куб минимального числа ({min_number}^3) = {cube} сохранен в {result_file}.") + + except FileNotFoundError: + print(f"Файл {data_file} не найден.") + except ValueError: + print("Ошибка в данных файла. Убедитесь, что файл содержит только числа.") + + +if __name__ == "__main__": + calculate_cube(data_file, result_file) \ No newline at end of file diff --git a/minhasapov_ruslan_lab_2/docker-compose.yaml b/minhasapov_ruslan_lab_2/docker-compose.yaml new file mode 100644 index 0000000..24a6c40 --- /dev/null +++ b/minhasapov_ruslan_lab_2/docker-compose.yaml @@ -0,0 +1,16 @@ +services: + app_1: # Сервис с первой программой + build: + context: ./app_1/ # Указываем путь к директории программы и докер файла + volumes: + - ./data:/var/data # Монтируем локальную директорию с данными в /var/data + - ./result:/var/result # Монтируем локальную директорию с результирующими данными в /var/result + + app_2: # Сервис со второй программой + depends_on: + - app_1 # Выполняем вторую программу после завершения первой + build: + context: ./app_2/ + volumes: + - ./data:/var/data + - ./result:/var/result \ No newline at end of file