sergeev_evgenii_lab_2 is done! #128
42
sergeev_evgenii_lab_2/README.md
Normal file
42
sergeev_evgenii_lab_2/README.md
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
## Задание
|
||||||
|
Развернуть два взаимосвязанных сервиса по варианту:
|
||||||
|
|
||||||
|
Вариант № 4 для первой программы:
|
||||||
|
* Сервис формирует файл /var/result/data.txt так, что каждая строка файла - количество символов в именах файлов из каталога /var/data.
|
||||||
|
Вариант № 2 для второй программы:
|
||||||
|
* Сервис ищет наименьшее число из файла /var/data/data.txt и сохраняет его третью степень в /var/result/result.txt.
|
||||||
|
## Выполнение
|
||||||
|
Были написаны два сервиса на языке python с использованием технологии flask.
|
||||||
|
Они выводят на страницу кнопки, при нажатии на которые происходит соответствующие действия по заданию
|
||||||
|
|
||||||
|
Для сервисов прописаны файлы Dockerfile, описывающие создание контейнеров:
|
||||||
|
* Для обоих контейнеров выбирается Python 11
|
||||||
|
* На оба контейнера пробрасываются порты, на которых работает приложение: 8081 для первого и 8082 для второго
|
||||||
|
* Внутри контейнеров создаются папки /work для файлов скриптов, папки /var/result, /var/data для обоих сервисов
|
||||||
|
* В оба контейнера устанавливается фреймворк Flask
|
||||||
|
* Выбирается рабочая директория /work и туда копируются файлы скриптов
|
||||||
|
* Командой запускаются сами скрипты
|
||||||
|
|
||||||
|
Общий yml-файл настроен следующим образом:
|
||||||
|
* блок services, где перечислены разворачиваемые сервисы.
|
||||||
|
* для каждого сервиса прописан build, где обозначается его папка
|
||||||
|
* для каждого сервиса прописано пробрасывание портов на хостовую машину
|
||||||
|
* для каждого сервиса прописано отображение внутриконтейнерных папок на хостовые
|
||||||
|
|
||||||
|
## Результат
|
||||||
|
Пример выполнения:
|
||||||
|
|
||||||
|
Исходные данные: четыре файла в папке /var/data с разным по длине названием
|
||||||
|
|
||||||
|
Ход работы: нажатие кнопок на странице первого сервиса, потом - второго
|
||||||
|
Созданные контейнеры:
|
||||||
|
![Контейнеры](images/containers.png)
|
||||||
|
|
||||||
|
Страница первого задания:
|
||||||
|
![Страница первого задания](images/exercise1.png)
|
||||||
|
|
||||||
|
Выходные данные при выполнении второго задания:
|
||||||
|
![Второе задание. Результат](images/exercise2.png)
|
||||||
|
|
||||||
|
## Ссылка на видео
|
||||||
|
https://youtu.be/CEAAr0xolxM
|
19
sergeev_evgenii_lab_2/docker-compose.yml
Normal file
19
sergeev_evgenii_lab_2/docker-compose.yml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
service1:
|
||||||
|
build:
|
||||||
|
context: ./service1
|
||||||
|
ports:
|
||||||
|
- "8081:8081"
|
||||||
|
volumes:
|
||||||
|
- .\var\data:/var/data
|
||||||
|
- .\var\result:/var/result
|
||||||
|
|
||||||
|
service2:
|
||||||
|
build:
|
||||||
|
context: ./service2
|
||||||
|
ports:
|
||||||
|
- "8082:8082"
|
||||||
|
volumes:
|
||||||
|
- ./var/result:/var/result
|
BIN
sergeev_evgenii_lab_2/images/containers.png
Normal file
BIN
sergeev_evgenii_lab_2/images/containers.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
BIN
sergeev_evgenii_lab_2/images/exercise1.png
Normal file
BIN
sergeev_evgenii_lab_2/images/exercise1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.9 KiB |
BIN
sergeev_evgenii_lab_2/images/exercise2.png
Normal file
BIN
sergeev_evgenii_lab_2/images/exercise2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.9 KiB |
15
sergeev_evgenii_lab_2/service1/Dockerfile
Normal file
15
sergeev_evgenii_lab_2/service1/Dockerfile
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
FROM python:3.11
|
||||||
|
|
||||||
|
ENV LISTEN_PORT=8081
|
||||||
|
EXPOSE 8081
|
||||||
|
|
||||||
|
RUN ["mkdir", "/work"]
|
||||||
|
RUN ["mkdir", "/var/data"]
|
||||||
|
RUN ["mkdir", "/var/result"]
|
||||||
|
RUN pip install Flask
|
||||||
|
|
||||||
|
WORKDIR /work
|
||||||
|
|
||||||
|
COPY index.html service1.py ./
|
||||||
|
|
||||||
|
CMD ["python", "service1.py"]
|
12
sergeev_evgenii_lab_2/service1/index.html
Normal file
12
sergeev_evgenii_lab_2/service1/index.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Сервис № 1</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<form action="http://localhost:8081/ex">
|
||||||
|
<input type="submit" value="Выполнить 1ое задание"/>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
39
sergeev_evgenii_lab_2/service1/service1.py
Normal file
39
sergeev_evgenii_lab_2/service1/service1.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
from flask import Flask, redirect, render_template
|
||||||
|
import os
|
||||||
|
|
||||||
|
app = Flask(__name__, template_folder='')
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def home():
|
||||||
|
return render_template("index.html")
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/ex')
|
||||||
|
def do():
|
||||||
|
current_directory = os.getcwd()
|
||||||
|
directory_elements = current_directory.split(os.path.sep) # Разделяем по разделителю каталогов
|
||||||
|
cur_d = os.path.sep.join(directory_elements[:-1])
|
||||||
|
data_dir = cur_d + '/var/data'
|
||||||
|
path_result_file = cur_d + '/var/result/data.txt'
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Получаем список файлов в указанном каталоге
|
||||||
|
files = os.listdir(data_dir)
|
||||||
|
|
||||||
|
# Формируем путь к каждому файлу и считаем количество символов в именах
|
||||||
|
characters_count_list = [len(file) for file in files]
|
||||||
|
|
||||||
|
# Пишем результат в файл data.txt
|
||||||
|
with open(path_result_file, 'w') as result_file:
|
||||||
|
for count in characters_count_list:
|
||||||
|
result_file.write(f'{count}\n')
|
||||||
|
|
||||||
|
print(f'Файл успешно создан.')
|
||||||
|
except Exception as e:
|
||||||
|
print(f'Произошла ошибка: {e}')
|
||||||
|
|
||||||
|
return redirect("/")
|
||||||
|
|
||||||
|
|
||||||
|
app.run(host='0.0.0.0', port=8081)
|
14
sergeev_evgenii_lab_2/service2/Dockerfile
Normal file
14
sergeev_evgenii_lab_2/service2/Dockerfile
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
FROM python:3.11
|
||||||
|
|
||||||
|
ENV LISTEN_PORT=8082
|
||||||
|
EXPOSE 8082
|
||||||
|
|
||||||
|
RUN ["mkdir", "/work"]
|
||||||
|
RUN ["mkdir", "/var/result"]
|
||||||
|
RUN pip install Flask
|
||||||
|
|
||||||
|
WORKDIR /work
|
||||||
|
|
||||||
|
COPY index.html result.html service2.py ./
|
||||||
|
|
||||||
|
CMD ["python", "service2.py"]
|
12
sergeev_evgenii_lab_2/service2/index.html
Normal file
12
sergeev_evgenii_lab_2/service2/index.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Сервис № 2</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<form action="http://localhost:8082/ex">
|
||||||
|
<input type="submit" value="Выполнить 2ое задание"/>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
10
sergeev_evgenii_lab_2/service2/result.html
Normal file
10
sergeev_evgenii_lab_2/service2/result.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Результат работы</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Результат: {{num}}</h2>
|
||||||
|
</body>
|
||||||
|
</html>
|
43
sergeev_evgenii_lab_2/service2/service2.py
Normal file
43
sergeev_evgenii_lab_2/service2/service2.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import os
|
||||||
|
from flask import Flask, render_template
|
||||||
|
|
||||||
|
app = Flask(__name__, template_folder='')
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def home():
|
||||||
|
return render_template("index.html")
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/ex')
|
||||||
|
def do():
|
||||||
|
current_directory = os.getcwd()
|
||||||
|
directory_elements = current_directory.split(os.path.sep) # Разделяем по разделителю каталогов
|
||||||
|
cur_d = os.path.sep.join(directory_elements[:-1])
|
||||||
|
path_data_file = cur_d + '/var/result/data.txt'
|
||||||
|
path_result_file = cur_d + '/var/result/result.txt'
|
||||||
|
|
||||||
|
min_number = 0
|
||||||
|
try:
|
||||||
|
# Чтение чисел из файла
|
||||||
|
with open(path_data_file, 'r') as file:
|
||||||
|
numbers = [float(line.strip()) for line in file]
|
||||||
|
|
||||||
|
# Поиск минимального числа
|
||||||
|
min_number = min(numbers)
|
||||||
|
|
||||||
|
# Возведение минимального числа в третью степень
|
||||||
|
result = min_number ** 3
|
||||||
|
|
||||||
|
# Запись результата в файл
|
||||||
|
with open(path_result_file, 'w') as result_file:
|
||||||
|
result_file.write(str(result))
|
||||||
|
|
||||||
|
print(f'Наименьшее число из файла {path_data_file} в третьей степени сохранено в {path_result_file}.')
|
||||||
|
except Exception as e:
|
||||||
|
print(f'Произошла ошибка: {e}')
|
||||||
|
|
||||||
|
return render_template("result.html", num=min_number)
|
||||||
|
|
||||||
|
|
||||||
|
app.run(host='0.0.0.0', port=8082)
|
0
sergeev_evgenii_lab_2/var/data/1
Normal file
0
sergeev_evgenii_lab_2/var/data/1
Normal file
0
sergeev_evgenii_lab_2/var/data/123
Normal file
0
sergeev_evgenii_lab_2/var/data/123
Normal file
0
sergeev_evgenii_lab_2/var/data/tutmnogobukv
Normal file
0
sergeev_evgenii_lab_2/var/data/tutmnogobukv
Normal file
0
sergeev_evgenii_lab_2/var/data/zdestozhe.txt
Normal file
0
sergeev_evgenii_lab_2/var/data/zdestozhe.txt
Normal file
Loading…
Reference in New Issue
Block a user