diff --git a/mochalov_danila_lab_2/.gitignore b/mochalov_danila_lab_2/.gitignore new file mode 100644 index 0000000..d8adfc8 --- /dev/null +++ b/mochalov_danila_lab_2/.gitignore @@ -0,0 +1,2 @@ +data +result \ No newline at end of file diff --git a/mochalov_danila_lab_2/README.md b/mochalov_danila_lab_2/README.md new file mode 100644 index 0000000..86e6338 --- /dev/null +++ b/mochalov_danila_lab_2/README.md @@ -0,0 +1,38 @@ +# Лабораторная работа №2 +#### ПИбд-42. Мочалов Данила. + +#### Задание: +Для выполнения лабораторной работы были выбраны следущие варианты программ: +- Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt. +- Сохраняет произведение первого и последнего числа из файла /var/data/data.txt в /var/result/result.txt. +Так как по заданию исходными данными для второй программы должен быть результат выполнения первой программы, было принято решение для второй программы брать данные из файла */var/result/data.txt* +Также было принято решение генерировать файлы для выполнения первой программы в ней же. + +#### При выполнении использовал: +- Python 3.12 +- Docker +- Docker Compose + +#### Инструкция: +Для запуска лабораторной работы, перейдите в папку *mochalov_danila_lab_2* и выполните команду: +``` +docker-compose up --build +``` + +#### Результат +``` +[+] Running 3/3 + ✔ Network mochalov_danila_lab_2_default Created 0.1s + ✔ Container mochalov_danila_lab_2-app_1-1 Created 0.1s + ✔ Container mochalov_danila_lab_2-app_2-1 Created 0.1s +Attaching to app_1-1, app_2-1 +app_1-1 | Создано 19 файлов в директории /var/data. +app_1-1 | Самый большой файл: /var/data/file_3.txt (288 байт) скопирован в /var/result/data.txt. +app_2-1 | Произведение первого и последнего числа (55 * 1) = 55 сохранено в /var/result/result.txt. + +app_1-1 exited with code 0 +app_2-1 exited with code 0 +``` + +#### Демонстрация работы +Доступна по [ссылке](https://drive.google.com/file/d/1Z0T5dYIZ4s3_MstOLmLX86JN072SDpea/view?usp=sharing) diff --git a/mochalov_danila_lab_2/app_1/Dockerfile b/mochalov_danila_lab_2/app_1/Dockerfile new file mode 100644 index 0000000..aaab8b8 --- /dev/null +++ b/mochalov_danila_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/mochalov_danila_lab_2/app_1/app_1.py b/mochalov_danila_lab_2/app_1/app_1.py new file mode 100644 index 0000000..fd744e1 --- /dev/null +++ b/mochalov_danila_lab_2/app_1/app_1.py @@ -0,0 +1,64 @@ +import os +import random +import shutil + +# Директории +source_directory = "/var/data" +destination_directory = "/var/result" +destination_file = os.path.join(destination_directory, "data.txt") + +# Генерация файлов +def generate_random_files(directory): + # Убедимся, что директория существует + os.makedirs(directory, exist_ok=True) + + # Генерируем случайное количество файлов (от 10 до 20) + num_files = random.randint(10, 20) + + for i in range(1, num_files + 1): + # Указываем имя файла + file_name = f"file_{i}.txt" + file_path = os.path.join(directory, file_name) + + # Генерируем случайное количество чисел (от 5 до 100) + num_numbers = random.randint(5, 100) + numbers = [str(random.randint(0, 100)) for _ in range(num_numbers)] + + # Записываем числа в файл, каждое с новой строки + with open(file_path, 'w') as f: + f.write("\n".join(numbers)) + + print(f"Создано {num_files} файлов в директории {directory}.") + +# Поиск и копирование самого большого файла +def find_and_copy_largest_file(source_directory, destination_directory, destination_file): + # Убедимся, что директория назначения существует + os.makedirs(destination_directory, exist_ok=True) + + # Поиск самого большого файла + largest_file = None + largest_size = 0 + + for file_name in os.listdir(source_directory): + file_path = os.path.join(source_directory, file_name) + + if os.path.isfile(file_path): + file_size = os.path.getsize(file_path) + + if file_size > largest_size: + largest_size = file_size + largest_file = file_path + + # Если найден самый большой файл, копируем его содержимое + if largest_file: + shutil.copy(largest_file, destination_file) + print(f"Самый большой файл: {largest_file} ({largest_size} байт) скопирован в {destination_file}.") + else: + print("В каталоге нет файлов для копирования.") + +def main(): + generate_random_files(source_directory) + find_and_copy_largest_file(source_directory, destination_directory, destination_file) + +if __name__ == "__main__": + main() diff --git a/mochalov_danila_lab_2/app_2/Dockerfile b/mochalov_danila_lab_2/app_2/Dockerfile new file mode 100644 index 0000000..5b52091 --- /dev/null +++ b/mochalov_danila_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/mochalov_danila_lab_2/app_2/app_2.py b/mochalov_danila_lab_2/app_2/app_2.py new file mode 100644 index 0000000..543b020 --- /dev/null +++ b/mochalov_danila_lab_2/app_2/app_2.py @@ -0,0 +1,40 @@ +import os + +# Пути к файлам +data_file = "/var/result/data.txt" +result_file = "/var/result/result.txt" + +# Функция для вычисления произведения первого и последнего числа +def calculate(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 len(numbers) < 2: + print("Недостаточно чисел в файле для вычисления произведения.") + return + + # Первое и последнее числа + first_number = numbers[0] + last_number = numbers[-1] + + # Вычисляем произведение + product = first_number * last_number + + # Записываем результат в файл + with open(result_file, 'w') as f: + f.write(str(product)) + + print(f"Произведение первого и последнего числа ({first_number} * {last_number}) = {product} сохранено в {result_file}.") + + except FileNotFoundError: + print(f"Файл {data_file} не найден.") + except ValueError: + print("Ошибка в данных файла. Убедитесь, что файл содержит только числа.") + +if __name__ == "__main__": + calculate(data_file, result_file) diff --git a/mochalov_danila_lab_2/docker-compose.yaml b/mochalov_danila_lab_2/docker-compose.yaml new file mode 100644 index 0000000..7cbe2bd --- /dev/null +++ b/mochalov_danila_lab_2/docker-compose.yaml @@ -0,0 +1,18 @@ +services: + # Сервис с первым скриптом + app_1: + build: + context: ./app_1/ # Указываем путь к директории скрипта и Dockerfile + volumes: # Монтируем локальную директорию с данными в /var/data и локальную директорию с результирующими данными в /var/result + - ./data:/var/data + - ./result:/var/result + + # Сервис со вторым скриптом + app_2: + depends_on: # Выполняем второй скрипт после завершения первого + - app_1 + build: + context: ./app_2/ # Указываем путь к директории скрипта и Dockerfile + volumes: # Монтируем локальную директорию с данными в /var/data и локальную директорию с результирующими данными в /var/result + - ./data:/var/data + - ./result:/var/result \ No newline at end of file