diff --git a/romanova_adelina_lab_2/1.png b/romanova_adelina_lab_2/1.png new file mode 100644 index 0000000..f27df08 Binary files /dev/null and b/romanova_adelina_lab_2/1.png differ diff --git a/romanova_adelina_lab_2/2.png b/romanova_adelina_lab_2/2.png new file mode 100644 index 0000000..5335035 Binary files /dev/null and b/romanova_adelina_lab_2/2.png differ diff --git a/romanova_adelina_lab_2/README.md b/romanova_adelina_lab_2/README.md new file mode 100644 index 0000000..33bee55 --- /dev/null +++ b/romanova_adelina_lab_2/README.md @@ -0,0 +1,179 @@ +# Лабораторная работа №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 diff --git a/romanova_adelina_lab_2/data/data_1.txt b/romanova_adelina_lab_2/data/data_1.txt new file mode 100644 index 0000000..0eb7e4c --- /dev/null +++ b/romanova_adelina_lab_2/data/data_1.txt @@ -0,0 +1,3 @@ +123 +456 +789 \ No newline at end of file diff --git a/romanova_adelina_lab_2/data/data_2.txt b/romanova_adelina_lab_2/data/data_2.txt new file mode 100644 index 0000000..8f6577f --- /dev/null +++ b/romanova_adelina_lab_2/data/data_2.txt @@ -0,0 +1,4 @@ +234 +125 +764 +789 \ No newline at end of file diff --git a/romanova_adelina_lab_2/data/data_3.txt b/romanova_adelina_lab_2/data/data_3.txt new file mode 100644 index 0000000..6dbce3a --- /dev/null +++ b/romanova_adelina_lab_2/data/data_3.txt @@ -0,0 +1,4 @@ +8903 +324 +232 +233 diff --git a/romanova_adelina_lab_2/docker-compose.yml b/romanova_adelina_lab_2/docker-compose.yml new file mode 100644 index 0000000..0220489 --- /dev/null +++ b/romanova_adelina_lab_2/docker-compose.yml @@ -0,0 +1,19 @@ +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 diff --git a/romanova_adelina_lab_2/result/data.txt b/romanova_adelina_lab_2/result/data.txt new file mode 100644 index 0000000..6dbce3a --- /dev/null +++ b/romanova_adelina_lab_2/result/data.txt @@ -0,0 +1,4 @@ +8903 +324 +232 +233 diff --git a/romanova_adelina_lab_2/result/result.txt b/romanova_adelina_lab_2/result/result.txt new file mode 100644 index 0000000..29986ff --- /dev/null +++ b/romanova_adelina_lab_2/result/result.txt @@ -0,0 +1 @@ +2074399 \ No newline at end of file diff --git a/romanova_adelina_lab_2/worker_1/Dockerfile b/romanova_adelina_lab_2/worker_1/Dockerfile new file mode 100644 index 0000000..7528506 --- /dev/null +++ b/romanova_adelina_lab_2/worker_1/Dockerfile @@ -0,0 +1,4 @@ +FROM python:3.11 +WORKDIR /app +COPY . . +CMD ["python", "worker_1.py"] diff --git a/romanova_adelina_lab_2/worker_1/worker_1.py b/romanova_adelina_lab_2/worker_1/worker_1.py new file mode 100644 index 0000000..944d425 --- /dev/null +++ b/romanova_adelina_lab_2/worker_1/worker_1.py @@ -0,0 +1,23 @@ +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() diff --git a/romanova_adelina_lab_2/worker_2/Dockerfile b/romanova_adelina_lab_2/worker_2/Dockerfile new file mode 100644 index 0000000..c4aa6ee --- /dev/null +++ b/romanova_adelina_lab_2/worker_2/Dockerfile @@ -0,0 +1,4 @@ +FROM python:3.11 +WORKDIR /app +COPY . . +CMD ["python", "worker_2.py"] diff --git a/romanova_adelina_lab_2/worker_2/worker_2.py b/romanova_adelina_lab_2/worker_2/worker_2.py new file mode 100644 index 0000000..8853c8f --- /dev/null +++ b/romanova_adelina_lab_2/worker_2/worker_2.py @@ -0,0 +1,32 @@ + + + +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()