forked from Alexey/DAS_2024_1
Merge pull request 'lazarev_andrey_lab_2' (#65) from lazarev_andrey_lab_2 into main
Reviewed-on: Alexey/DAS_2024_1#65
This commit is contained in:
commit
d23e808325
1
lazarev_andrey_lab_2/.gitignore
vendored
Normal file
1
lazarev_andrey_lab_2/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
var/
|
56
lazarev_andrey_lab_2/README.md
Normal file
56
lazarev_andrey_lab_2/README.md
Normal 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)
|
||||
|
24
lazarev_andrey_lab_2/docker-compose.yml
Normal file
24
lazarev_andrey_lab_2/docker-compose.yml
Normal 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" и будет запущен после него
|
8
lazarev_andrey_lab_2/first/Dockerfile
Normal file
8
lazarev_andrey_lab_2/first/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
||||
#описание в Dockerfile generateFiles
|
||||
FROM python:3.9-slim
|
||||
|
||||
WORKDIR /first
|
||||
|
||||
COPY first.py /first/
|
||||
|
||||
CMD ["python", "first.py"]
|
31
lazarev_andrey_lab_2/first/first.py
Normal file
31
lazarev_andrey_lab_2/first/first.py
Normal 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()
|
11
lazarev_andrey_lab_2/generateFiles/Dockerfile
Normal file
11
lazarev_andrey_lab_2/generateFiles/Dockerfile
Normal 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"]
|
32
lazarev_andrey_lab_2/generateFiles/generateFiles.py
Normal file
32
lazarev_andrey_lab_2/generateFiles/generateFiles.py
Normal 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)
|
8
lazarev_andrey_lab_2/second/Dockerfile
Normal file
8
lazarev_andrey_lab_2/second/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
||||
#описание в Dockerfile generateFiles
|
||||
FROM python:3.9-slim
|
||||
|
||||
WORKDIR /second
|
||||
|
||||
COPY second.py /second/
|
||||
|
||||
CMD ["python", "second.py"]
|
26
lazarev_andrey_lab_2/second/second.py
Normal file
26
lazarev_andrey_lab_2/second/second.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user