Merge pull request 'kosheev_maksim_lab_2' (#171) from kosheev_maksim_lab_2 into main
Reviewed-on: #171
This commit is contained in:
commit
0887bc1d98
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