From a8c0d980bace1edcceb925441516930712d7ae81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=BE=D0=B2?= Date: Fri, 17 Nov 2023 00:44:42 +0400 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20=D0=BB?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- alexandrov_dmitrii_lab_2/docker-compose.yml | 19 +++++++++ alexandrov_dmitrii_lab_2/readme.md | 37 ++++++++++++++++++ alexandrov_dmitrii_lab_2/screens/requests.png | Bin 0 -> 29400 bytes alexandrov_dmitrii_lab_2/screens/res.png | Bin 0 -> 6388 bytes alexandrov_dmitrii_lab_2/var/data/file1.txt | 3 ++ alexandrov_dmitrii_lab_2/var/data/file2.txt | 5 +++ alexandrov_dmitrii_lab_2/var/data/file3.txt | 4 ++ alexandrov_dmitrii_lab_2/var/result/data.txt | 5 +++ .../var/result/result.txt | 1 + alexandrov_dmitrii_lab_2/worker-1/Dockerfile | 15 +++++++ .../worker-1/template.html | 12 ++++++ alexandrov_dmitrii_lab_2/worker-1/worker-1.py | 29 ++++++++++++++ alexandrov_dmitrii_lab_2/worker-2/Dockerfile | 14 +++++++ alexandrov_dmitrii_lab_2/worker-2/result.html | 10 +++++ .../worker-2/template.html | 12 ++++++ alexandrov_dmitrii_lab_2/worker-2/worker-2.py | 34 ++++++++++++++++ 16 files changed, 200 insertions(+) create mode 100644 alexandrov_dmitrii_lab_2/docker-compose.yml create mode 100644 alexandrov_dmitrii_lab_2/readme.md create mode 100644 alexandrov_dmitrii_lab_2/screens/requests.png create mode 100644 alexandrov_dmitrii_lab_2/screens/res.png create mode 100644 alexandrov_dmitrii_lab_2/var/data/file1.txt create mode 100644 alexandrov_dmitrii_lab_2/var/data/file2.txt create mode 100644 alexandrov_dmitrii_lab_2/var/data/file3.txt create mode 100644 alexandrov_dmitrii_lab_2/var/result/data.txt create mode 100644 alexandrov_dmitrii_lab_2/var/result/result.txt create mode 100644 alexandrov_dmitrii_lab_2/worker-1/Dockerfile create mode 100644 alexandrov_dmitrii_lab_2/worker-1/template.html create mode 100644 alexandrov_dmitrii_lab_2/worker-1/worker-1.py create mode 100644 alexandrov_dmitrii_lab_2/worker-2/Dockerfile create mode 100644 alexandrov_dmitrii_lab_2/worker-2/result.html create mode 100644 alexandrov_dmitrii_lab_2/worker-2/template.html create mode 100644 alexandrov_dmitrii_lab_2/worker-2/worker-2.py diff --git a/alexandrov_dmitrii_lab_2/docker-compose.yml b/alexandrov_dmitrii_lab_2/docker-compose.yml new file mode 100644 index 0000000..e27dc59 --- /dev/null +++ b/alexandrov_dmitrii_lab_2/docker-compose.yml @@ -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 \ No newline at end of file diff --git a/alexandrov_dmitrii_lab_2/readme.md b/alexandrov_dmitrii_lab_2/readme.md new file mode 100644 index 0000000..0c5ff86 --- /dev/null +++ b/alexandrov_dmitrii_lab_2/readme.md @@ -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 \ No newline at end of file diff --git a/alexandrov_dmitrii_lab_2/screens/requests.png b/alexandrov_dmitrii_lab_2/screens/requests.png new file mode 100644 index 0000000000000000000000000000000000000000..195d5961b78654898cde861840f1702d54b21d34 GIT binary patch literal 29400 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 literal 0 HcmV?d00001 diff --git a/alexandrov_dmitrii_lab_2/screens/res.png b/alexandrov_dmitrii_lab_2/screens/res.png new file mode 100644 index 0000000000000000000000000000000000000000..506564383fd93b75b1d7b8bb38356cf2af2a9291 GIT binary patch literal 6388 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 + + + + Worker 1 + + +
+ +
+ + \ No newline at end of file diff --git a/alexandrov_dmitrii_lab_2/worker-1/worker-1.py b/alexandrov_dmitrii_lab_2/worker-1/worker-1.py new file mode 100644 index 0000000..6b27e99 --- /dev/null +++ b/alexandrov_dmitrii_lab_2/worker-1/worker-1.py @@ -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) diff --git a/alexandrov_dmitrii_lab_2/worker-2/Dockerfile b/alexandrov_dmitrii_lab_2/worker-2/Dockerfile new file mode 100644 index 0000000..7d1718d --- /dev/null +++ b/alexandrov_dmitrii_lab_2/worker-2/Dockerfile @@ -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"] diff --git a/alexandrov_dmitrii_lab_2/worker-2/result.html b/alexandrov_dmitrii_lab_2/worker-2/result.html new file mode 100644 index 0000000..d98bf9e --- /dev/null +++ b/alexandrov_dmitrii_lab_2/worker-2/result.html @@ -0,0 +1,10 @@ + + + + + Worker 2 + + +

Результат: {{res_num}}

+ + \ No newline at end of file diff --git a/alexandrov_dmitrii_lab_2/worker-2/template.html b/alexandrov_dmitrii_lab_2/worker-2/template.html new file mode 100644 index 0000000..c223e2a --- /dev/null +++ b/alexandrov_dmitrii_lab_2/worker-2/template.html @@ -0,0 +1,12 @@ + + + + + Worker 2 + + +
+ +
+ + \ No newline at end of file diff --git a/alexandrov_dmitrii_lab_2/worker-2/worker-2.py b/alexandrov_dmitrii_lab_2/worker-2/worker-2.py new file mode 100644 index 0000000..807ad84 --- /dev/null +++ b/alexandrov_dmitrii_lab_2/worker-2/worker-2.py @@ -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)