second lab done

This commit is contained in:
an.lazarev 2024-10-14 16:27:36 +04:00
parent 8a96320fd5
commit 3c6c7f47e8
9 changed files with 197 additions and 0 deletions

1
lazarev_andrey_lab_2/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
var/

View File

@ -0,0 +1,56 @@
# Лабораторная работа №2
## Описание проекта
Проект разворачивает 3 программы в отдельных контейнерах с использованием Docker Compose:
1. **generateFiles** - программа, выполняющая подготовку для последующих задач(генерирует файлы и помещает их в `./var/data`);
2. **first** - программа, выполняющая задачу 1.0 (ищет самый большой по объему файл в `./var/data` и перекладывает его в `./var/result`);
3. **second** - программа, выполняющая задачу 2.1 (ищет наибольшее число в найденном раннее файле и записывет его квадрат в `./var/result/result.txt`).
## Струкутура проекта
### Проект состоит из:
- 3 папки(generateFiles, first, second)
- Каждая папка содержит в себе файл с расширением `.py` с кодом программы;
- Кадлая папка сожержит в себе файл `Dockerfile` с инструкцией по созданию Docker образа.
- Файл `.gitignore` для исключения временных файлов директории `var/`;
- Файл `docker-compose.yml` с конфигурацией Docker Compose.
Каждый файл содержит в себе комментарии с описанием функциональности.
## Запуск
1. Скачать и установить Docker и Docker Compose;
2. Перейти в директорию с файлом docker-compose.yml;
3. Открыть консоль и запустить сервисы командой
```bash
docker-compose up --build -d
```
4. Дождаться запуска всех сервисов
```bash
[+] Running 3/3
✔ Container lazarev_andrey_lab_2-generate-files-1 Started 0.5s
✔ Container lazarev_andrey_lab_2-first-1 Started 1.3s
✔ Container lazarev_andrey_lab_2-second-1 Started 2.0s
```
5. Остановка всех сервисов
Для завершения работы с сервисами необходимо выполнить команду:
```bash
docker-compose down
```
Дождаться завершения работы:
```bash
[+] Running 4/4
✔ Container lazarev_andrey_lab_2-second-1 Removed 0.0s
✔ Container lazarev_andrey_lab_2-first-1 Removed 0.0s
✔ Container lazarev_andrey_lab_2-generate-files-1 Removed 0.0s
✔ Network lazarev_andrey_lab_2_default Removed 0.4s
```
## Видеодемонстрация работоспособности
[Демонстрация работы сервисов](https://files.ulstu.ru/s/5EKdE7mFfApLDkr)

View File

@ -0,0 +1,24 @@
services:
generate-files: # Определяет первый сервис с именем "generate-files"
build:
context: ./generateFiles # Указывает путь к Docker-контексту для сборки образа (./generateFiles)
volumes:
- ./var/data:/data # Монтирует локальную директорию ./var/data в контейнерную директорию /data
first: # Определяет второй сервис с именем "first"
build:
context: ./first # Указывает путь к Docker-контексту для сборки образа (./first)
volumes:
- ./var/data:/data # Монтирует локальную директорию ./var/data в контейнерную директорию /data
- ./var/result:/result # Монтирует локальную директорию ./var/result в контейнерную директорию /result
depends_on:
- generate-files # Определяет, что сервис "first" зависит от "generate-files" и будет запущен после него
second: # Определяет третий сервис с именем "second"
build:
context: ./second # Указывает путь к Docker-контексту для сборки образа (./second)
volumes:
- ./var/result:/result # Монтирует локальную директорию ./var/result в контейнерную директорию /result
depends_on:
- first # Определяет, что сервис "second" зависит от "first" и будет запущен после него

View File

@ -0,0 +1,8 @@
#описание в Dockerfile generateFiles
FROM python:3.9-slim
WORKDIR /first
COPY first.py /first/
CMD ["python", "first.py"]

View File

@ -0,0 +1,31 @@
import os
filesPath="/data" #путь до папки с данными
resultPath="/result" #путь до папки с результатами
#функция нахождения файла с наибольшим объемом
def find_highest_volume():
maxSizeFileName = ""
maxSize = 0
for filename in os.listdir(filesPath):
curSize = os.path.getsize(f"{filesPath}/{filename}")
if maxSize < curSize :
maxSize = curSize
maxSizeFileName = filename
dataFile = open(f"{filesPath}/{maxSizeFileName}", "r")
result = open(f"{resultPath}/{maxSizeFileName}", "w+")
result.write(dataFile.read())
print(f"файлик({maxSizeFileName}) с наибольшим объемом найден, перемещаем его")
#проверка наличия папки с результатами
if not os.path.exists(resultPath):
print("создаем папку для результатов")
os.mkdir(resultPath)
else: #если папка есть очищает ее
for filename in os.listdir(resultPath):
if os.path.isfile(f"{resultPath}/{filename}"):
os.remove(f"{resultPath}/{filename}")
print("удаляем файлы из папки с результатами")
#находит файл с наибольшим объемом
find_highest_volume()

View File

@ -0,0 +1,11 @@
# Использует базовый образ Python 3.9 на основе slim-версии, которая минимальна и легковесна
FROM python:3.9-slim
# Устанавливает рабочую директорию в контейнере как /generatefiles
WORKDIR /generatefiles
# Копирует файл first.py из текущей директории на хосте в директорию /generatefiles в контейнере
COPY generateFiles.py /generatefiles/
# Задает команду для запуска контейнера: выполнение скрипта generateFiles.py с помощью Python
CMD ["python", "generateFiles.py"]

View File

@ -0,0 +1,32 @@
import os
import random
fPath = '/data' #путь до папки
#функция очищения папки
def empty_folder():
for filename in os.listdir(fPath):
if os.path.isfile(f"{fPath}/{filename}"):
os.remove(f"{fPath}/{filename}")
print("папка был очищена и готова к наполнению")
#функция генерации файлов
def gen_Files(files, minLines, maxLines):
for i in range(files):
file = open(f"{fPath}/file_{i}.txt", "w+")
for _ in range(random.randint(minLines, maxLines)):
num=random.randint(20, 1000)
file.write(f"{num} \n")
file.close()
print("файлы созданы и готовы к работе")
#проверка наличия папки
if os.path.exists(fPath): #если папка есть очищает ее
print("папка есть и полна старых файлов")
empty_folder()
else: #если папки нет создает ее
print("папки нет, надо создать")
os.mkdir(fPath)
#генерирует файлы в папке(5-20), в каждом файле от 1 до 500 строк
gen_Files(random.randint(5, 20), 1, 500)

View File

@ -0,0 +1,8 @@
#описание в Dockerfile generateFiles
FROM python:3.9-slim
WORKDIR /second
COPY second.py /second/
CMD ["python", "second.py"]

View File

@ -0,0 +1,26 @@
import os
import math
rPath="/result"
#функция поиска наибольшего числа в файле, возведение в степень и запись в итоговый файл
def find_highest_num():
hightesVolumeFile = os.listdir(f"{rPath}")[0]
dataFile = open(f"{rPath}/{hightesVolumeFile}", "r")
lines = [line.strip() for line in dataFile]
highestNumber = max(lines)
resultFile = open(f"{rPath}/result.txt", "w+")
resultFile.write(str(pow(int(highestNumber), 2)))
print(f"Нашел наибольшее число({highestNumber}) и возвел его в степень ({pow(int(highestNumber), 2)})")
#проверка если в папке result есть файл с результатами(удаляем его)
if os.path.exists(f"{rPath}/result.txt"):
os.remove(f"{rPath}/result.txt")
print("результаты уже есть, удаляем")
#поиск наибольшего числа, возведения в степень и запись в итоговый файл
find_highest_num()