diff --git a/lazarev_andrey_lab_2/.gitignore b/lazarev_andrey_lab_2/.gitignore new file mode 100644 index 0000000..cef5ae5 --- /dev/null +++ b/lazarev_andrey_lab_2/.gitignore @@ -0,0 +1 @@ +var/ \ No newline at end of file diff --git a/lazarev_andrey_lab_2/README.md b/lazarev_andrey_lab_2/README.md new file mode 100644 index 0000000..8669ca0 --- /dev/null +++ b/lazarev_andrey_lab_2/README.md @@ -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) + diff --git a/lazarev_andrey_lab_2/docker-compose.yml b/lazarev_andrey_lab_2/docker-compose.yml new file mode 100644 index 0000000..937ff15 --- /dev/null +++ b/lazarev_andrey_lab_2/docker-compose.yml @@ -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" и будет запущен после него diff --git a/lazarev_andrey_lab_2/first/Dockerfile b/lazarev_andrey_lab_2/first/Dockerfile new file mode 100644 index 0000000..f20d59a --- /dev/null +++ b/lazarev_andrey_lab_2/first/Dockerfile @@ -0,0 +1,8 @@ +#описание в Dockerfile generateFiles +FROM python:3.9-slim + +WORKDIR /first + +COPY first.py /first/ + +CMD ["python", "first.py"] \ No newline at end of file diff --git a/lazarev_andrey_lab_2/first/first.py b/lazarev_andrey_lab_2/first/first.py new file mode 100644 index 0000000..4ce8189 --- /dev/null +++ b/lazarev_andrey_lab_2/first/first.py @@ -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() \ No newline at end of file diff --git a/lazarev_andrey_lab_2/generateFiles/Dockerfile b/lazarev_andrey_lab_2/generateFiles/Dockerfile new file mode 100644 index 0000000..f93f967 --- /dev/null +++ b/lazarev_andrey_lab_2/generateFiles/Dockerfile @@ -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"] diff --git a/lazarev_andrey_lab_2/generateFiles/generateFiles.py b/lazarev_andrey_lab_2/generateFiles/generateFiles.py new file mode 100644 index 0000000..c83165a --- /dev/null +++ b/lazarev_andrey_lab_2/generateFiles/generateFiles.py @@ -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) \ No newline at end of file diff --git a/lazarev_andrey_lab_2/second/Dockerfile b/lazarev_andrey_lab_2/second/Dockerfile new file mode 100644 index 0000000..7045b55 --- /dev/null +++ b/lazarev_andrey_lab_2/second/Dockerfile @@ -0,0 +1,8 @@ +#описание в Dockerfile generateFiles +FROM python:3.9-slim + +WORKDIR /second + +COPY second.py /second/ + +CMD ["python", "second.py"] \ No newline at end of file diff --git a/lazarev_andrey_lab_2/second/second.py b/lazarev_andrey_lab_2/second/second.py new file mode 100644 index 0000000..39ee9f6 --- /dev/null +++ b/lazarev_andrey_lab_2/second/second.py @@ -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() \ No newline at end of file