# Лабораторная работа №2 - Разработка простейшего распределённого приложения ## Задание * Разработать два приложения такие, что результат первого является исходными данными для второго. * Собрать файл ```docker-compose.yml``` для запуска приложений. Изучить файлы сборки образов ```docker``` и разработать их для созданных приложений и правильно закоммитить решение ### Варианты задания:  1. ```worker_1``` - ищет в каталоге ```/var/data``` самый большой по объёму файл и перекладывает его в ```/var/result/data.txt```  2. ```worker_2``` - Сохраняет произведение первого и последнего числа из файла ```/var/data/data.txt``` в ```/var/result/result.txt``` ## Запуск Введение в терминале команды: ``` docker compose up --build ``` ## Описание работы: Для разработки приложений был выбран язык программирования - ```python``` ### Разработка приложения worker_1 ```worker_1``` - ищет в каталоге ```/var/data``` самый большой по объёму файл и перекладывает его в ```/var/result/data.txt``` Листинг кода: ```import os import shutil def find_largest_file(directory): files = os.listdir(directory) if not files: return None largest_file = max(files, key=lambda f: os.path.getsize(os.path.join(directory, f))) return largest_file def main(): data_dir = '/var/data' result_file = '/var/result/data.txt' largest_file = find_largest_file(data_dir) if largest_file: shutil.copy2(os.path.join(data_dir, largest_file), result_file) else: print('No files to copy.') if __name__ == "__main__": main() ``` Листинг кода сборки образа ```Dockerfile``` ``` FROM python:3.11 WORKDIR /app COPY . . CMD ["python", "worker_1.py"] ``` ```WORKDIR /app:``` Эта строка устанавливает рабочую директорию внутри контейнера в /app. Все последующие инструкции Docker будут выполняться в этой директории. ```COPY ..``` Эта строка копирует содержимое текущего каталога (где находится Dockerfile) внутрь контейнера в рабочую директорию /app. ```CMD ["python", "worker_1.py"]:``` Эта строка задает команду, которая будет выполнена при запуске контейнера. В данном случае, она запускает скрипт worker_1.py с использованием интерпретатора Python. ### Разработка приложения worker_2 ```worker_2``` - Сохраняет произведение первого и последнего числа из файла ```/var/data/data.txt``` в ```/var/result/result.txt` Листинг кода: ``` def calculate_product_of_first_and_last_numbers(file_path): try: with open(file_path, 'r') as file: numbers = [int(line.strip()) for line in file.readlines()] if len(numbers) >= 2: product = numbers[0] * numbers[-1] print(f"Результат: {numbers[0]} * {numbers[-1]} = {product}") return product else: return None except Exception as e: return None def main(): input_file_path = "/var/data/data.txt" output_file_path = "/var/result/result.txt" result = calculate_product_of_first_and_last_numbers(input_file_path) if result is not None: with open(output_file_path, 'w') as output_file: output_file.write(str(result)) else: print("No result to save.") if __name__ == "__main__": main() ``` Листинг кода сборки образа ```Dockerfile``` ``` FROM python:3.11 WORKDIR /app COPY . . CMD ["python", "worker_2.py"] ``` Работа сборки образа происходит аналогично первой программе. ### Формирование файла docker-compose.yml ``` version: "3" services: worker_1: build: context: ./worker_1 dockerfile: Dockerfile volumes: - ./data:/var/data - ./result:/var/result worker_2: depends_on: - worker_1 build: context: ./worker_2 dockerfile: Dockerfile volumes: - ./result:/var/data - ./result:/var/result ``` ```build``` указывает на метод сборки образа в котором: ```context``` указывает на корневую директорию приложения, а dockerfile указывает на путь к ```Dockerfile```, ```volumes``` устанавливает локальную папку ```data``` как папку входных файлов ```/var/data```, а локальную папку ```result``` - как папку выходных файлов ```/var/result```. ### Исходные данные папки data Содержание файла data_1.txt: ``` 123 456 789 ``` Содержание файла data_2.txt: ``` 234 125 764 789 ``` Содержание файла data_2.txt: ``` 8903 324 232 233 ``` # Скриншоты работы Успешно выполненная работа: ![](1.png "") Работа Docker Desktop: ![](2.png "") # Youtube https://youtu.be/WCKIk1zlH7o