Merge pull request 'karamushko_maxim_lab_2' (#384) from karamushko_maxim_lab_2 into main

Reviewed-on: #384
This commit is contained in:
Alexey 2025-01-02 13:08:33 +04:00
commit f2adc3ea18
7 changed files with 208 additions and 0 deletions

3
karamushko_maxim_lab_2/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
data/
result_first/
result_second/

View File

@ -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

View File

@ -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

View File

@ -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"]

View File

@ -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("Не найдены файлы")

View File

@ -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"]

View File

@ -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("Нет чисел в файле.")