davydov_yuriy_lab_2

This commit is contained in:
S3 2024-12-20 11:50:51 +03:00
parent bc087de470
commit f4748631c8
8 changed files with 284 additions and 0 deletions

5
davydov_yuriy_lab_2/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
data/
result/
result_first/
result_second/
datagen.py

BIN
davydov_yuriy_lab_2/2.mp4 Normal file

Binary file not shown.

View File

@ -0,0 +1,85 @@
# Лабораторная работа №2 - Разработка простейшего распределенного приложения
## ПИбд-42 || Давыдов Юрий
## Описание
В рамках данной лабораторной работы были созданы два контейнера с простыми программами на Python, которые выполняют следующие условия: результат работы первой программы служит исходными данными для второй программы.
Цель лабораторной работы
Изучение процесса создания простого распределённого приложения.
1. Варианты
Для обеих программ был выбран вариант 1.
Описание первой программы: 1. Программа находит в каталоге /var/data файл с наибольшим количеством строк и перемещает его в /var/result/data.txt.
Описание второй программы: 1. Программа находит наибольшее число в файле /var/data/data.txt и записывает его квадрат в /var/result/result.txt.
2. Dockerfile
Оба Dockerfile имеют схожую структуру:
Dockerfile
Копировать код
# Используем базовый образ python
FROM python:3.12
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем код в рабочую директорию
COPY main.py .
# Указываем /var/data как монтируемую директорию
VOLUME ["/var/data"]
# Указываем /var/result как монтируемую директорию
VOLUME ["/var/result"]
# Задаем команду для запуска программы
CMD ["python", "main.py"] 3. Docker-compose
docker-compose.yml:
yaml
Копировать код
services:
# Первая программа
first: # Директория для сборки первой программы
build: ./WorkFirst/ # Монтируем 2 каталога из хост-системы
volumes: - ./data:/var/data - ./result_first:/var/result
# Вторая программа
second: # Директория для сборки второй программы
build: ./WorkSecond/ # Задаем зависимость запуска через depends_on
depends_on: - first # Монтируем 2 каталога из хост-системы
volumes: - ./result_first:/var/data - ./result_second:/var/result 4. Инструкция для работы
Клонировать репозиторий:
bash
Копировать код
git clone <ссылка-на-репозиторий>
cd <папка репозитория>
cd <папка лабораторной работы>
```
2. Запуск контейнеров:
```
docker compose up --build
```
3. Результаты:
Итог работы первой программы будет в папке `result_first`, а второй - в `result_second`.
```

View File

@ -0,0 +1,16 @@
#Берем базовый образ python
FROM python:3.12
#Устанавливаем рабочую директорию
WORKDIR /app
#Копирум код в рабочую директорию
COPY main.py .
#Задаем /var/data как монтируемый
VOLUME ["/var/data"]
#Задаем /var/result как монтируемый
VOLUME ["/var/result"]
#Задаем команду для выполнения программы
CMD ["python", "main.py"]

View File

@ -0,0 +1,81 @@
import os
import random
# Путь к каталогу для поиска файла с наибольшим кол-вом строк
CATALOG_PATH = "/var/data"
# Путь до файла с результатом
RESULT_FILE = "/var/result/data.txt"
def find_file_with_most_lines(directory):
"""Ищет файл с наибольшим количеством строк в заданном каталоге и его подкаталогах."""
file_with_most_lines = None
max_lines = 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:
line_count = sum(1 for _ in f)
if line_count > max_lines:
max_lines = line_count
file_with_most_lines = (filepath, line_count)
except (OSError, UnicodeDecodeError) as e:
print(f"Ошибка при обработке файла '{filepath}': {e}")
return file_with_most_lines
def copy_file(first, second):
"""Копирует содержимое файла first в файл second."""
try:
with open(second, "wb") as f_second, open(first, "rb") as f_first:
while chunk := f_first.read(4096):
f_second.write(chunk)
print(f"Файл '{first}' успешно скопирован в '{second}'.")
except Exception as e:
print(f"Ошибка при копировании файла '{first}': {e}")
def main():
file_with_most_lines = find_file_with_most_lines(CATALOG_PATH)
if file_with_most_lines:
first_path, _ = file_with_most_lines
second_path = RESULT_FILE
copy_file(first_path, second_path)
else:
print("Не найдены файлы")
def generate_random_numbers(filename, count):
"""Функция генерирует случайные числа и записывает их в файл"""
with open(filename, "w") as f:
for _ in range(count):
num = random.randint(0, 1000)
f.write(str(num) + "\n")
print(f"Случайные числа успешно записаны в '{filename}'.")
if __name__ == "__main__":
generate_random_numbers("/var/data/data1.txt", 25)
generate_random_numbers("/var/data/data2.txt", 30)
generate_random_numbers("/var/data/data3.txt", 27)
generate_random_numbers("/var/data/data4.txt", 12)
generate_random_numbers("/var/data/data5.txt", 19)
print("Генерация файлов завершена")
main()

View File

@ -0,0 +1,16 @@
#Берем базовый образ python
FROM python:3.12
#Устанавливаем рабочую директорию
WORKDIR /app
#Копирум код в рабочую директорию
COPY main.py .
#Задаем /var/data как монтируемый
VOLUME ["/var/data"]
#Задаем /var/result как монтируемый
VOLUME ["/var/result"]
#Задаем команду для выполнения программы
CMD ["python", "main.py"]

View File

@ -0,0 +1,60 @@
# Путь к файлу для чтения
DATA_FILE = "/var/data/data.txt"
# Путь к файлу для записи
RESULT_FILE = "/var/result/result.txt"
def find_biggest_number(data_file):
"""Поиск наибольшего числа в файле"""
try:
with open(data_file, "r") as f:
numbers = [int(line.strip()) for line in f.readlines()]
biggest_num = max(numbers)
return biggest_num
except ValueError as e:
print(f"Ошибка преобразования строки: {e}")
except Exception as e:
print(f"Ошибка чтения файла '{data_file}': {e}")
return None
def square_number(num):
"""Возвращает квадрат числа"""
return num**2
def write_result(result_file, result):
"""Фиксирует результат в файл."""
try:
with open(result_file, "w") as f:
f.write(str(result))
print(f"Результат '{result}' успешно передан в '{result_file}'.")
except Exception as e:
print(f"Ошибка фиксации результата в файл '{result_file}': {e}")
def main():
biggest_num = find_biggest_number(DATA_FILE)
if biggest_num is not None:
result = square_number(biggest_num)
write_result(RESULT_FILE, result)
print(result)
else:
print("Нет чисел в файле.")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,21 @@
services:
#Первая программа
first:
#Директория для сборки первой программы
build: ./WorkFirst/
#Монтирование 2 каталогов из хост системы
volumes:
- ./data:/var/data
- ./result_first:/var/result
#Вторая программа
second:
#Директория для сборки второй программы
build: ./WorkSecond/
#Задание очередности запуска через depends_on
depends_on:
- first
#Монтирование 2 каталогов из хост системы
volumes:
- ./result_first:/var/data
- ./result_second:/var/result