kosheev_maksim_lab_2 #171
2
kosheev_maksim_lab_2/.gitignote
Normal file
2
kosheev_maksim_lab_2/.gitignote
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
result
|
||||||
|
data
|
38
kosheev_maksim_lab_2/README.md
Normal file
38
kosheev_maksim_lab_2/README.md
Normal 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)
|
||||||
|
|
4
kosheev_maksim_lab_2/data/data.txt
Normal file
4
kosheev_maksim_lab_2/data/data.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
490
|
||||||
|
198
|
||||||
|
76
|
||||||
|
550
|
42
kosheev_maksim_lab_2/data/random_file_1.txt
Normal file
42
kosheev_maksim_lab_2/data/random_file_1.txt
Normal 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
|
89
kosheev_maksim_lab_2/data/random_file_2.txt
Normal file
89
kosheev_maksim_lab_2/data/random_file_2.txt
Normal 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
|
14
kosheev_maksim_lab_2/data_generator/Dockerfile
Normal file
14
kosheev_maksim_lab_2/data_generator/Dockerfile
Normal 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"]
|
34
kosheev_maksim_lab_2/data_generator/generate_data.py
Normal file
34
kosheev_maksim_lab_2/data_generator/generate_data.py
Normal 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}")
|
28
kosheev_maksim_lab_2/docker-compose.yml
Normal file
28
kosheev_maksim_lab_2/docker-compose.yml
Normal 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:
|
3
kosheev_maksim_lab_2/result/data.txt
Normal file
3
kosheev_maksim_lab_2/result/data.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
490
|
||||||
|
233
|
||||||
|
711
|
1
kosheev_maksim_lab_2/result/result.txt
Normal file
1
kosheev_maksim_lab_2/result/result.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
302500
|
11
kosheev_maksim_lab_2/worker-1/Dockerfile
Normal file
11
kosheev_maksim_lab_2/worker-1/Dockerfile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Используем образ Python
|
||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
# Создаем рабочий каталог
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Копируем скрипт в контейнер
|
||||||
|
COPY main.py .
|
||||||
|
|
||||||
|
# Команда для запуска программы
|
||||||
|
CMD ["python", "main.py"]
|
16
kosheev_maksim_lab_2/worker-1/main.py
Normal file
16
kosheev_maksim_lab_2/worker-1/main.py
Normal 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)
|
11
kosheev_maksim_lab_2/worker-2/Dockerfile
Normal file
11
kosheev_maksim_lab_2/worker-2/Dockerfile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Используем образ Python
|
||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
# Создаем рабочий каталог
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Копируем скрипт в контейнер
|
||||||
|
COPY main.py .
|
||||||
|
|
||||||
|
# Команда для запуска программы
|
||||||
|
CMD ["python", "main.py"]
|
14
kosheev_maksim_lab_2/worker-2/main.py
Normal file
14
kosheev_maksim_lab_2/worker-2/main.py
Normal 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)
|
Loading…
Reference in New Issue
Block a user