forked from Alexey/DAS_2024_1
pupkov_alexey_lab_2 is ready
This commit is contained in:
parent
3b9698ac38
commit
0a822fc3e5
78
pupkov_alexey_lab_2/README.md
Normal file
78
pupkov_alexey_lab_2/README.md
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
|
||||||
|
|
||||||
|
## Задание
|
||||||
|
|
||||||
|
Цель: Разработать два приложения, результат работы первого из которых становится входными данными для второго.
|
||||||
|
|
||||||
|
Задачи:
|
||||||
|
1. Разработать два приложения:
|
||||||
|
- search max lines: Ищет в каталоге /var/data файл с наибольшим количеством строк и копирует его содержимое в /var/result/data.txt.
|
||||||
|
- search max number: Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt/
|
||||||
|
2. Разработать файлы сборки Docker для каждого приложения.
|
||||||
|
3. Собрать файл docker-compose.yml для запуска обоих приложений.
|
||||||
|
4. Настроить монтирование директорий для обмена данными между контейнерами.
|
||||||
|
5. Правильно закоммитить решение с использованием .gitignore для исключения лишних файлов.
|
||||||
|
|
||||||
|
## Варианты задания:
|
||||||
|
|
||||||
|
1. search max lines:
|
||||||
|
- Ищет файл с наибольшим количеством строк в каталоге /var/data.
|
||||||
|
- Копирует содержимое этого файла в /var/result/data.txt.
|
||||||
|
|
||||||
|
2. search max number:
|
||||||
|
- Читает файл /var/result/data.txt.
|
||||||
|
- Ищет набольшее число и сохраняет его вторую степень в /var/result/result.txt.
|
||||||
|
|
||||||
|
### Требования:
|
||||||
|
1. Docker: Платформа для контейнеризации приложений.
|
||||||
|
2. Docker Compose: Инструмент для управления многоконтейнерными приложениями на основе файла docker-compose.yml.
|
||||||
|
|
||||||
|
### Сборка и запуск:
|
||||||
|
|
||||||
|
В директории, где находится файл docker-compose.yml, выполним команду для сборки и запуска всех контейнеров:
|
||||||
|
|
||||||
|
|
||||||
|
docker-compose up --build
|
||||||
|
|
||||||
|
|
||||||
|
Эта команда:
|
||||||
|
1. Собирает все Docker-образы для сервисов.
|
||||||
|
2. Запускает контейнеры.
|
||||||
|
3. Автоматически подготавливает данные и выполняет приложения последовательно.
|
||||||
|
|
||||||
|
### Результаты:
|
||||||
|
|
||||||
|
После успешного завершения работы контейнеров можно проверить результаты в папке result:
|
||||||
|
- data.txt — файл, полученный после выполнения первого приложения (содержит копию файла с наибольшим количеством строк из папки data).
|
||||||
|
- result.txt — файл, полученный после выполнения второго приложения (содержит вторую степень наибольшего числа из файла data.txt).
|
||||||
|
|
||||||
|
## Описание работы
|
||||||
|
|
||||||
|
### Программы:
|
||||||
|
|
||||||
|
1. search_max_lines/main.py:
|
||||||
|
- Ищет файл с наибольшим количеством строк в каталоге /var/data.
|
||||||
|
- Копирует содержимое этого файла в /var/result/data.txt.
|
||||||
|
|
||||||
|
2. search_max_number/main.py:
|
||||||
|
- Читает файл /var/result/data.txt.
|
||||||
|
- Ищет наибольшее число в файле и возводит его в вторую степень.
|
||||||
|
- Сохраняет результат в файл /var/result/result.txt.
|
||||||
|
|
||||||
|
### Генерация данных:
|
||||||
|
|
||||||
|
Для создания случайных данных был написан скрипт generate_data.py:
|
||||||
|
- Создает несколько файлов с целыми числами в каталоге /var/data.
|
||||||
|
- Каждый файл содержит случайные числа, которые будут использоваться первым приложением.
|
||||||
|
|
||||||
|
### Dockerfile:
|
||||||
|
|
||||||
|
Каждое приложение имеет собственный Dockerfile, где указаны шаги для сборки Python-образов и запуска программ.
|
||||||
|
|
||||||
|
## Вывод
|
||||||
|
|
||||||
|
В результате лабораторной работы было создано простейшее распределенное приложение, которое использует Docker и Docker Compose для запуска двух программ, обрабатывающих данные в контейнерах.
|
||||||
|
|
||||||
|
## Видео ВК
|
||||||
|
|
||||||
|
[Ссылка на демонстрацию работы программы](https://vk.com/video547368103_456239600?list=ln-YscnzBfpyobmc7eiKl)
|
7
pupkov_alexey_lab_2/data_generator/Dockerfile
Normal file
7
pupkov_alexey_lab_2/data_generator/Dockerfile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY . /app
|
||||||
|
|
||||||
|
CMD ["python", "generate_data.py"]
|
32
pupkov_alexey_lab_2/data_generator/generate_data.py
Normal file
32
pupkov_alexey_lab_2/data_generator/generate_data.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import os
|
||||||
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
def generate_random_files(directory, num_files, min_value, max_value,min_lines_per_file,max_lines_per_file):
|
||||||
|
os.makedirs(directory, exist_ok=True)
|
||||||
|
|
||||||
|
for i in range(num_files):
|
||||||
|
file_path = os.path.join(directory, f"file_{i + 1}.txt")
|
||||||
|
num_lines_per_file = random.randint(min_lines_per_file,max_lines_per_file)
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
for _ in range(num_lines_per_file):
|
||||||
|
random_number = random.randint(min_value, max_value)
|
||||||
|
f.write(f"{random_number}\n")
|
||||||
|
print(f"Generated file: {file_path}")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
data_directory = '/var/data'
|
||||||
|
max_lines_per_file = 20
|
||||||
|
min_lines_per_file = 8
|
||||||
|
|
||||||
|
num_files = 10
|
||||||
|
min_value = 1
|
||||||
|
max_value = 100
|
||||||
|
|
||||||
|
generate_random_files(data_directory, num_files, min_value, max_value,min_lines_per_file,max_lines_per_file)
|
||||||
|
print(f"Generated {num_files} files in {data_directory}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
7
pupkov_alexey_lab_2/search_max_lines/Dockerfile
Normal file
7
pupkov_alexey_lab_2/search_max_lines/Dockerfile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY . /app
|
||||||
|
|
||||||
|
CMD ["python", "main.py"]
|
41
pupkov_alexey_lab_2/search_max_lines/main.py
Normal file
41
pupkov_alexey_lab_2/search_max_lines/main.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
def find_file_with_most_lines(directory):
|
||||||
|
max_lines = 0
|
||||||
|
target_file = None
|
||||||
|
|
||||||
|
# Проходим по всем файлам в указанном каталоге
|
||||||
|
for filename in os.listdir(directory):
|
||||||
|
filepath = os.path.join(directory, filename)
|
||||||
|
|
||||||
|
# Проверяем, является ли это файлом
|
||||||
|
if os.path.isfile(filepath):
|
||||||
|
with open(filepath, 'r') as file:
|
||||||
|
lines = file.readlines()
|
||||||
|
line_count = len(lines)
|
||||||
|
|
||||||
|
# Если текущее количество строк больше максимального, обновляем
|
||||||
|
if line_count > max_lines:
|
||||||
|
max_lines = line_count
|
||||||
|
target_file = filepath
|
||||||
|
|
||||||
|
return target_file
|
||||||
|
|
||||||
|
def copy_file_content(source_file, destination_file):
|
||||||
|
if source_file:
|
||||||
|
# Копируем содержимое файла в новый файл
|
||||||
|
shutil.copy(source_file, destination_file)
|
||||||
|
print(f'Содержимое файла {source_file} скопировано в {destination_file}.')
|
||||||
|
else:
|
||||||
|
print('Не найдено файлов в указанном каталоге.')
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
source_directory = '/var/data'
|
||||||
|
destination_file = '/var/result/data.txt'
|
||||||
|
|
||||||
|
# Находим файл с наибольшим количеством строк
|
||||||
|
file_with_most_lines = find_file_with_most_lines(source_directory)
|
||||||
|
|
||||||
|
# Копируем его содержимое в целевой файл
|
||||||
|
copy_file_content(file_with_most_lines, destination_file)
|
7
pupkov_alexey_lab_2/search_max_number/Dockerfile
Normal file
7
pupkov_alexey_lab_2/search_max_number/Dockerfile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY . /app
|
||||||
|
|
||||||
|
CMD ["python", "main.py"]
|
40
pupkov_alexey_lab_2/search_max_number/main.py
Normal file
40
pupkov_alexey_lab_2/search_max_number/main.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
def find_maximum_number(file_path):
|
||||||
|
try:
|
||||||
|
with open(file_path, 'r') as file:
|
||||||
|
numbers = [int(line.strip()) for line in file if line.strip().isdigit()]
|
||||||
|
|
||||||
|
if not numbers:
|
||||||
|
raise ValueError("Файл не содержит чисел.")
|
||||||
|
|
||||||
|
max_number = max(numbers)
|
||||||
|
return max_number
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"Файл {file_path} не найден.")
|
||||||
|
return None
|
||||||
|
except ValueError as e:
|
||||||
|
print(e)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def save_to_file(file_path, value):
|
||||||
|
try:
|
||||||
|
with open(file_path, 'w') as file:
|
||||||
|
file.write(str(value))
|
||||||
|
print(f'Наибольшее число в квадрате ({value}) сохранено в {file_path}.')
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Ошибка при записи в файл: {e}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
input_file = '/var/result/data.txt'
|
||||||
|
output_file = '/var/result/result.txt'
|
||||||
|
|
||||||
|
# Находим наибольшее число
|
||||||
|
max_number = find_maximum_number(input_file)
|
||||||
|
|
||||||
|
if max_number is not None:
|
||||||
|
# Возводим в квадрат
|
||||||
|
result = max_number ** 2
|
||||||
|
|
||||||
|
# Сохраняем результат в файл
|
||||||
|
save_to_file(output_file, result)
|
Loading…
Reference in New Issue
Block a user