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