alexandrov_dmitrii_lab_2 ready #17
19
alexandrov_dmitrii_lab_2/docker-compose.yml
Normal file
19
alexandrov_dmitrii_lab_2/docker-compose.yml
Normal 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
|
37
alexandrov_dmitrii_lab_2/readme.md
Normal file
37
alexandrov_dmitrii_lab_2/readme.md
Normal 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
|
BIN
alexandrov_dmitrii_lab_2/screens/requests.png
Normal file
BIN
alexandrov_dmitrii_lab_2/screens/requests.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
BIN
alexandrov_dmitrii_lab_2/screens/res.png
Normal file
BIN
alexandrov_dmitrii_lab_2/screens/res.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.2 KiB |
3
alexandrov_dmitrii_lab_2/var/data/file1.txt
Normal file
3
alexandrov_dmitrii_lab_2/var/data/file1.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
10
|
||||||
|
20
|
||||||
|
15
|
5
alexandrov_dmitrii_lab_2/var/data/file2.txt
Normal file
5
alexandrov_dmitrii_lab_2/var/data/file2.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
30
|
||||||
|
40
|
||||||
|
35
|
||||||
|
15
|
||||||
|
10
|
4
alexandrov_dmitrii_lab_2/var/data/file3.txt
Normal file
4
alexandrov_dmitrii_lab_2/var/data/file3.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
20
|
||||||
|
30
|
||||||
|
25
|
||||||
|
40
|
5
alexandrov_dmitrii_lab_2/var/result/data.txt
Normal file
5
alexandrov_dmitrii_lab_2/var/result/data.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
30
|
||||||
|
40
|
||||||
|
35
|
||||||
|
15
|
||||||
|
10
|
1
alexandrov_dmitrii_lab_2/var/result/result.txt
Normal file
1
alexandrov_dmitrii_lab_2/var/result/result.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
1600
|
15
alexandrov_dmitrii_lab_2/worker-1/Dockerfile
Normal file
15
alexandrov_dmitrii_lab_2/worker-1/Dockerfile
Normal 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"]
|
12
alexandrov_dmitrii_lab_2/worker-1/template.html
Normal file
12
alexandrov_dmitrii_lab_2/worker-1/template.html
Normal 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>
|
29
alexandrov_dmitrii_lab_2/worker-1/worker-1.py
Normal file
29
alexandrov_dmitrii_lab_2/worker-1/worker-1.py
Normal 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)
|
14
alexandrov_dmitrii_lab_2/worker-2/Dockerfile
Normal file
14
alexandrov_dmitrii_lab_2/worker-2/Dockerfile
Normal 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"]
|
10
alexandrov_dmitrii_lab_2/worker-2/result.html
Normal file
10
alexandrov_dmitrii_lab_2/worker-2/result.html
Normal 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>
|
12
alexandrov_dmitrii_lab_2/worker-2/template.html
Normal file
12
alexandrov_dmitrii_lab_2/worker-2/template.html
Normal 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>
|
34
alexandrov_dmitrii_lab_2/worker-2/worker-2.py
Normal file
34
alexandrov_dmitrii_lab_2/worker-2/worker-2.py
Normal 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)
|
Loading…
Reference in New Issue
Block a user