alexandrov_dmitrii_lab_2 ready #17

Merged
Alexey merged 1 commits from alexandrov_dmitrii_lab_2 into main 2023-12-05 22:24:38 +04:00
16 changed files with 200 additions and 0 deletions

View File

@ -0,0 +1,19 @@
services:
worker-1:
build:
context: /worker-1
dockerfile: Dockerfile
ports:
- 8081:8081
volumes:
- .\var\data:/var/data
- .\var\result:/var/result
worker-2:
build:
context: /worker-2
dockerfile: Dockerfile
ports:
- 8082:8082
volumes:
- .\var\result:/var/result

View File

@ -0,0 +1,37 @@
## Задание
Развернуть два взаимосвязанных сервиса по варианту:
Вариант 1:
* Сервис 1 ищет в каталоге /var/data файл с наибольшим количеством строк и перекладывает его в /var/result/data.txt.
* Сервис 2 ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt.
## Выполнение
Были написаны два сервиса на языке python с технологией flask. Они выводят на страницу кнопки, по которым происходило срабатывание скриптов по варианту.
Для сервисов прописаны файлы Dockerfile, описывающие создание контейнеров:
* Для обоих контейнеров выбирается Python 9.
* Оба контейнера проявляют порты, на которых работает приложение: 8081 для первого и 8082 для второго.
* В контейнерах создаются папки /work для файлов скриптов, папки /var/result для обоих сервисов и /var/data для первого скрипта.
* В оба контейнера устанавливается пакет Flask.
* Выбирается рабочая директория /work и туда копируются файлы скриптов.
* Командой запускаются сами скрипты.
Общий yaml-файл развёртки был настроен следующим образом:
* блок services, где перечислены разворачиваемые сервисы.
* для каждого сервиса прописан build, где объявляется его папка и докерфайл создания.
* для каждого сервиса прописано отображение портов на такие же хоста.
* для каждого сервиса прописано монтирование нужных папок хостовой системы как соответствующих папок внутри контейнеров.
## Результат
Пример выполнения:
Исходные данные: три файла в папке /var/data, средний файл имеет наибольшее количество строк и наибольшее число 40.
Ход работы: нажатие кнопок на странице первого сервиса, потом - второго.
Запросы:
![Запросы](screens/requests.png)
Выходные данные: средний файл, перенесённый в /var/result/data.txt, файл result.txt там же с результатом вычислений - числом 1600. Результат выведен на страницу второго сервиса:
![Результат](screens/res.png)
## Ссылка на видео
https://drive.google.com/file/d/1ZI1FeQ8BqPR-e_dKnUlNW7V5A39ZlTYu/view?usp=drive_link

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -0,0 +1,3 @@
10
20
15

View File

@ -0,0 +1,5 @@
30
40
35
15
10

View File

@ -0,0 +1,4 @@
20
30
25
40

View File

@ -0,0 +1,5 @@
30
40
35
15
10

View File

@ -0,0 +1 @@
1600

View File

@ -0,0 +1,15 @@
FROM python:3.9
ENV LISTEN_PORT=8081
EXPOSE 8081
RUN ["mkdir", "/work"]
RUN ["mkdir", "/var/data"]
RUN ["mkdir", "/var/result"]
RUN pip install Flask
WORKDIR /work
COPY template.html worker-1.py ./
CMD ["python", "worker-1.py"]

View File

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Worker 1</title>
</head>
<body>
<form action="http://127.0.0.1:8081/do">
<input type="submit" value="Выполнить"/>
</form>
</body>
</html>

View File

@ -0,0 +1,29 @@
from flask import Flask, redirect, render_template
import os
app = Flask(__name__, template_folder='')
@app.route('/')
def home():
return render_template("template.html")
@app.route('/do')
def do():
data_dir = '/var/data'
result_file = '/var/result/data.txt'
text = []
for filename in os.listdir(data_dir):
with open(os.path.join(data_dir, filename), 'r') as file:
txt = file.readlines()
if len(text) < len(txt):
text = txt
with open(result_file, 'w') as result:
result.writelines(text)
return redirect("/")
app.run(host='0.0.0.0', port=8081)

View File

@ -0,0 +1,14 @@
FROM python:3.9
ENV LISTEN_PORT=8082
EXPOSE 8082
RUN ["mkdir", "/work"]
RUN ["mkdir", "/var/result"]
RUN pip install Flask
WORKDIR /work
COPY template.html result.html worker-2.py ./
CMD ["python", "worker-2.py"]

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Worker 2</title>
</head>
<body>
<h2>Результат: {{res_num}}</h2>
</body>
</html>

View File

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Worker 2</title>
</head>
<body>
<form action="http://127.0.0.1:8082/do">
<input type="submit" value="Выполнить"/>
</form>
</body>
</html>

View File

@ -0,0 +1,34 @@
from flask import Flask, render_template
import re
app = Flask(__name__, template_folder='')
@app.route('/')
def home():
return render_template("template.html")
@app.route('/do')
def do():
data_file = '/var/result/data.txt'
result_file = '/var/result/result.txt'
numbers = []
with open(data_file, 'r') as file:
txt = file.read()
numbers = map(int, re.findall(r'\d+', txt))
max_v = 0
for val in numbers:
if max_v < val:
max_v = val
max_v = max_v * max_v
with open(result_file, 'w') as result:
result.write(str(max_v))
return render_template("result.html", res_num=max_v)
app.run(host='0.0.0.0', port=8082)