diff --git a/karamushko_maxim_lab_2/.gitignore b/karamushko_maxim_lab_2/.gitignore new file mode 100644 index 0000000..e43d977 --- /dev/null +++ b/karamushko_maxim_lab_2/.gitignore @@ -0,0 +1,3 @@ +data/ +result_first/ +result_second/ \ No newline at end of file diff --git a/karamushko_maxim_lab_2/README.md b/karamushko_maxim_lab_2/README.md new file mode 100644 index 0000000..9cca24f --- /dev/null +++ b/karamushko_maxim_lab_2/README.md @@ -0,0 +1,34 @@ +# Лабораторная работа №2 - Разработка простейшего распределенного приложения +## ПИбд-42 || Карамушко Максим + +## Описание +В данной лабораторной работе было создано два докер контейнера с программами на python: service1 и service2. Результат выполнения service1 является исходными данными для service2. + +Для этой лабораторной работы выбран вариант 1. + +### Первая программа: +Ищет в /var/data файл с наибольшим количеством строк и перемещает его в /var/result/data.txt. + +### Вторая программа: +**1**. Ищет наибольшее число в /var/data/data.txt возводит его в квадрат и сохраняет в /var/result/result.txt. + +Докерфайлы имеют схожую структуру. + +### Инструкция для работы +1. Клонирование репозитория: +``` +git clone <ссылка-на-репозиторий> +cd <папка репозитория> +cd <папка лабораторной работы> +``` + +2. Запуск контейнеров: +``` +docker compose up --build +``` + +3. Результаты: +Итог работы первой программы будет в папке `result_first`, а второй - в `result_second`. + +### Видео с демонстрацией работы: +https://disk.yandex.ru/i/_HDHTKq3vVGsSA \ No newline at end of file diff --git a/karamushko_maxim_lab_2/docker-compose.yml b/karamushko_maxim_lab_2/docker-compose.yml new file mode 100644 index 0000000..c868233 --- /dev/null +++ b/karamushko_maxim_lab_2/docker-compose.yml @@ -0,0 +1,21 @@ +services: + #Первый сервис + first: + #Директория для сборки первого сервиса + build: ./service1/ + #Монтирование 2 каталогов + volumes: + - ./data:/var/data + - ./result_first:/var/result + + #Второй сервис + second: + #Директория для сборки второго сервиса + build: ./service2/ + #Второй сервис запускается после первого + depends_on: + - first + #Монтирование 2 каталогов + volumes: + - ./result_first:/var/data + - ./result_second:/var/result \ No newline at end of file diff --git a/karamushko_maxim_lab_2/service1/Dockerfile b/karamushko_maxim_lab_2/service1/Dockerfile new file mode 100644 index 0000000..ada972d --- /dev/null +++ b/karamushko_maxim_lab_2/service1/Dockerfile @@ -0,0 +1,16 @@ + #Берем базовый образ python + FROM python:3.12 + + #Устанавливаем рабочую директорию + WORKDIR /service + + #Копирум код в рабочую директорию + COPY service.py . + + #Задаем /var/data как монтируемый + VOLUME ["/var/data"] + #Задаем /var/result как монтируемый + VOLUME ["/var/result"] + + #Задаем команду для выполнения программы + CMD ["python", "service.py"] \ No newline at end of file diff --git a/karamushko_maxim_lab_2/service1/service.py b/karamushko_maxim_lab_2/service1/service.py new file mode 100644 index 0000000..f2a1903 --- /dev/null +++ b/karamushko_maxim_lab_2/service1/service.py @@ -0,0 +1,73 @@ +import os +import random + +# Путь к каталогу для поиска файла с наибольшим кол-вом строк +path = "/var/data" + +# Путь до файла с результатом +resultPath = "/var/result/data.txt" + + +def getMaxLines(directory): + result = None + maxLines = 0 + + for root, _, files in os.walk(directory): + for file in files: + filepath = os.path.join(root, file) + + try: + with open(filepath, 'r', encoding='utf-8') as f: + cnt = 0 + for line in f: + cnt += 1 + + if cnt > maxLines: + maxLines = cnt + result = (filepath, cnt) + + except (OSError, UnicodeDecodeError) as e: + print(f"Ошибка при обработке файла '{filepath}': {e}") + + return result + + +def copyFile(first, second): + try: + with open(second, "wb") as second, open(first, "rb") as first: + while chunk := first.read(4096): + second.write(chunk) + + print(f"Файл '{first}' успешно скопирован в '{second}'.") + + except Exception as e: + print(f"Ошибка при копировании файла '{first}': {e}") + + +def generateRandomFiles(filename, count): + with open(filename, "w") as f: + for _ in range(count): + num = random.randint(0, 5000) + f.write(str(num) + "\n") + + print(f"Случайные числа успешно записаны в '{filename}'.") + + +if __name__ == "__main__": + generateRandomFiles("/var/data/file1.txt", 6) + generateRandomFiles("/var/data/file2.txt", 9) + generateRandomFiles("/var/data/file3.txt", 19) + generateRandomFiles("/var/data/file4.txt", 11) + generateRandomFiles("/var/data/file5.txt", 15) + print("Генерация файлов завершена") + + maxFile = getMaxLines(path) + + if maxFile: + fPath, _ = maxFile + sPath = resultPath + + copyFile(fPath, sPath) + + else: + print("Не найдены файлы") \ No newline at end of file diff --git a/karamushko_maxim_lab_2/service2/Dockerfile b/karamushko_maxim_lab_2/service2/Dockerfile new file mode 100644 index 0000000..ada972d --- /dev/null +++ b/karamushko_maxim_lab_2/service2/Dockerfile @@ -0,0 +1,16 @@ + #Берем базовый образ python + FROM python:3.12 + + #Устанавливаем рабочую директорию + WORKDIR /service + + #Копирум код в рабочую директорию + COPY service.py . + + #Задаем /var/data как монтируемый + VOLUME ["/var/data"] + #Задаем /var/result как монтируемый + VOLUME ["/var/result"] + + #Задаем команду для выполнения программы + CMD ["python", "service.py"] \ No newline at end of file diff --git a/karamushko_maxim_lab_2/service2/service.py b/karamushko_maxim_lab_2/service2/service.py new file mode 100644 index 0000000..fc807ed --- /dev/null +++ b/karamushko_maxim_lab_2/service2/service.py @@ -0,0 +1,45 @@ +# Путь к файлу для чтения +path = "/var/data/data.txt" + +# Путь к файлу для записи +resultPath = "/var/result/result.txt" + + +def findMaxNum(path): + try: + with open(path, "r") as f: + numbers = [int(line.strip()) for line in f.readlines()] + + maxNum = max(numbers) + return maxNum + + except ValueError as e: + print(f"Ошибка преобразования строки: {e}") + + except Exception as e: + print(f"Ошибка чтения файла '{path}': {e}") + + return None + + + +def printRes(resultPath, result): + try: + with open(resultPath, "w") as f: + f.write(str(result)) + + print(f"Результат '{result}' успешно передан в '{resultPath}'.") + + except Exception as e: + print(f"Ошибка фиксации результата в файл '{resultPath}': {e}") + + +if __name__ == "__main__": + maxNum = findMaxNum(path) + + if maxNum is not None: + printRes(resultPath, maxNum ** 2) + print(maxNum ** 2) + + else: + print("Нет чисел в файле.") \ No newline at end of file