Merge pull request 'kosheev_maksim_lab_2' (#171) from kosheev_maksim_lab_2 into main

Reviewed-on: #171
This commit is contained in:
Alexey 2024-11-29 10:24:02 +04:00
commit 0887bc1d98
14 changed files with 307 additions and 0 deletions

View File

@ -0,0 +1,2 @@
result
data

View File

@ -0,0 +1,38 @@
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
## Задание
Разработать два приложения такие, что результат первого является исходными данными для второго.
Собрать файл `docker-compose.yml` для запуска приложений. Изучить файлы сборки образов Docker и создать их для разработанных приложений, корректно закоммитить решение.
## Варианты задания
1. **worker-1** - Формирует файл `/var/result/data.txt` из первых строк всех файлов каталога
2. **worker-2** - Ищет набольшее число из файла `/var/data/data.txt` и сохраняет его вторую степень в `/var/result/result.txt`.
## Запуск
## Запуск работы
1. Убедиться, что установлены необходимые технологии:
- Docker: Платформа для контейнеризации приложений.
- Docker Compose: Инструмент для запуска многоконтейнерных приложений на основе `docker-compose.yaml`. Обычно поставляется вместе с Docker. Чтобы проверить, установлена ли утилита, нужно запустить команду:
```bash
docker-compose --version
```
2. В директории, где находится файл `docker-compose.yaml`, выполнить следующую команду для запуска всех сервисов:
```bash
docker-compose up --build
```
Эта команда сначала выполнит сборку, а затем запустит контейнеры.
3. После успешного запуска можно перейти в каталог проекта и увидеть папку data со сгенерированными файлами и папку result, в которой два текстовых файла:
- data.txt - файл, полученный после выполнения первой программы.
- result.txt -файл, полученный после выполнения второй программы.
## Описание работы:
Для разработки приложений был выбран язык программирования - ```python```
Построчное описание docker-compose.yaml и других файлов выполнено в самих файлах.
## [Видео](https://disk.yandex.ru/i/IRM2gmjud4hj9w)

View File

@ -0,0 +1,4 @@
490
198
76
550

View File

@ -0,0 +1,42 @@
233
92
225
823
302
606
564
980
312
744
10
261
808
364
642
712
815
250
547
147
708
166
228
678
831
521
314
764
230
547
85
611
139
707
743
761
168
166
229
315
765
356

View File

@ -0,0 +1,89 @@
711
154
141
610
133
704
335
429
743
77
843
329
805
536
303
927
392
640
947
488
664
716
815
611
338
686
212
512
896
450
378
752
48
910
240
514
513
933
266
465
949
362
496
646
359
638
938
255
17
339
598
343
148
896
16
151
954
530
920
954
70
734
596
632
549
628
514
311
685
496
735
21
756
132
830
620
779
447
701
222
553
857
742
79
852
453
481
3
412

View File

@ -0,0 +1,14 @@
# Используем базовый образ Python
FROM python:3.9-slim
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем скрипт генератора
COPY generate_data.py .
# Устанавливаем переменную среды для указания пути к файлу
ENV DATA_PATH=/var/data
# Запуск скрипта генерации данных
CMD ["python", "generate_data.py"]

View File

@ -0,0 +1,34 @@
import os
import random
# Директория для генерации файлов
output_dir = '/var/data'
os.makedirs(output_dir, exist_ok=True)
# Генерируем случайное количество файлов (1-15)
num_files = random.randint(1, 15)
# Функция для генерации случайного файла
def generate_random_file(filename):
num_lines = random.randint(1, 100)
with open(filename, 'w') as f:
for _ in range(num_lines):
random_number = random.randint(0, 1000)
f.write(f"{random_number}\n")
# Генерация нескольких случайных файлов
for i in range(num_files):
filename = os.path.join(output_dir, f'random_file_{i + 1}.txt')
generate_random_file(filename)
print(f"Генерация файла {filename} завершена.")
# Дополнительно создаём файл data.txt со случайными числами
data_file = os.path.join(output_dir, 'data.txt')
with open(data_file, 'w') as f:
num_lines = random.randint(1, 100)
for _ in range(num_lines):
random_number = random.randint(0, 1000)
f.write(f"{random_number}\n")
print(f"Файл {data_file} успешно сгенерирован с {num_lines} строками.")
print(f"Общее количество сгенерированных файлов: {num_files + 1}")

View File

@ -0,0 +1,28 @@
version: '3.8'
services:
data-generator:
build: ./data_generator
volumes:
- ./data:/var/data
command: ["python", "generate_data.py"]
worker1:
build: ./worker-1
volumes:
- ./data:/var/data
- ./result:/var/result
depends_on:
- data-generator
worker2:
build: ./worker-2
volumes:
- ./data:/var/data
- ./result:/var/result
depends_on:
- worker1
volumes:
data:
result:

View File

@ -0,0 +1,3 @@
490
233
711

View File

@ -0,0 +1 @@
302500

View File

@ -0,0 +1,11 @@
# Используем образ Python
FROM python:3.9-slim
# Создаем рабочий каталог
WORKDIR /app
# Копируем скрипт в контейнер
COPY main.py .
# Команда для запуска программы
CMD ["python", "main.py"]

View File

@ -0,0 +1,16 @@
import os
input_dir = '/var/data'
output_file = '/var/result/data.txt'
def get_first_line_from_files(input_directory, output_path):
with open(output_path, 'w') as outfile:
for filename in os.listdir(input_directory):
file_path = os.path.join(input_directory, filename)
if os.path.isfile(file_path):
with open(file_path, 'r') as infile:
first_line = infile.readline().strip()
outfile.write(first_line + '\n')
if __name__ == "__main__":
get_first_line_from_files(input_dir, output_file)

View File

@ -0,0 +1,11 @@
# Используем образ Python
FROM python:3.9-slim
# Создаем рабочий каталог
WORKDIR /app
# Копируем скрипт в контейнер
COPY main.py .
# Команда для запуска программы
CMD ["python", "main.py"]

View File

@ -0,0 +1,14 @@
input_file = '/var/data/data.txt'
output_file = '/var/result/result.txt'
def find_square_of_max(input_path, output_path):
with open(input_path, 'r') as infile:
numbers = [int(line.strip()) for line in infile if line.strip().isdigit()]
if numbers:
max_number = max(numbers)
square_of_max = max_number ** 2
with open(output_path, 'w') as outfile:
outfile.write(str(square_of_max))
if __name__ == "__main__":
find_square_of_max(input_file, output_file)