Merge pull request 'dolgov_dmitriy_lab_2' (#48) from dolgov_dmitriy_lab_2 into main

Reviewed-on: #48
This commit is contained in:
Alexey 2024-10-07 23:44:23 +04:00
commit 85b809333b
9 changed files with 189 additions and 0 deletions

2
dolgov_dmitriy_lab_2/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
data
result

View File

@ -0,0 +1,36 @@
# Лабораторная работа №2
## Выполнил: Долгов Дмитрий, группа ПИбд-42
### Были выбраны следующие варианты программ:
* _Вариант первого приложения: 6._ Берёт из каталога /var/data случайный файл и перекладывает его в /var/result/data.txt.
* _Вариант второго приложения: 1._ Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt.
Кроме того, для генерации файлов был реализован сервис file_generator
### Были использованы следующие технологии:
* git
* docker
* docker-compose
* язык программирования Python
### Для запуска лабораторной работы, находясь в папке `dolgov_dmitriy_lab_2`, необходимо выполнить следующую команду:
```
docker-compose up --build
```
Таким образом, запустятся все сервисы, необходимые для выполнения лабораторной работы.
## Результат запуска:
```
app2-1 | Наибольшее числовое значение: 29.0
app2-1 | Результат: 841.0
app1-1 | Файл file_3.txt успешно перемещен в /var/result/data.txt
app2-1 exited with code 0
app1-1 exited with code 0
```
## Видео с результатом запуска:
Видео можно посмотреть по данной [ссылке](https://drive.google.com/file/d/1Iw6BR0lRvh4382QsIEfr5E68-09aKX9C/view?usp=drive_link).

View File

@ -0,0 +1,8 @@
# Стандартный образ Python
FROM python:3.9
# Указываем рабочую директорию
WORKDIR /app
# Копируем в ней файл app1.py
COPY app1.py .
# Команда для запуска при старте контейнера
CMD ["python", "app1.py"]

View File

@ -0,0 +1,27 @@
import os
import random
import shutil
def move_random_file():
src_dir = "/var/data"
dst_file = "/var/result/data.txt"
# Получаем список всех файлов в src_dir
files = os.listdir(src_dir)
if files:
# Выбираем случайный файл
random_file = random.choice(files)
# Проверяем, что файл существует
if os.path.exists(os.path.join(src_dir, random_file)):
# Перемещаем файл в целевое место
shutil.move(os.path.join(src_dir, random_file), dst_file)
print(f"Файл {random_file} успешно перемещен в {dst_file}")
else:
print(f"Ошибка: Файл {random_file} не найден в {src_dir}")
else:
print("Папка пуста")
if __name__ == "__main__":
move_random_file()

View File

@ -0,0 +1,8 @@
# Стандартный образ Python
FROM python:3.9
# Указываем рабочую директорию
WORKDIR /app
# Копируем содержимое текущей директории в рабочую директорию
COPY app2.py .
# Запускаем приложение
CMD ["python", "app2.py"]

View File

@ -0,0 +1,26 @@
import os
from math import sqrt
def find_largest_number_and_square():
input_file = "/var/data/data.txt"
output_file = "/var/result/result.txt"
try:
with open(input_file, 'r') as f:
numbers = [float(num.strip()) for num in f]
largest_num = max(numbers)
squared_num = largest_num ** 2
with open(output_file, 'w') as f:
f.write(str(squared_num))
print(f"Наибольшее числовое значение: {largest_num}")
print(f"Результат: {squared_num}")
except FileNotFoundError:
print(f"Ошибка: Файл {input_file} не найден")
except ValueError:
print("Ошибка: В файле содержатся некорректные данные")
if __name__ == "__main__":
find_largest_number_and_square()

View File

@ -0,0 +1,42 @@
# Сервисы, которые будут запускаться
services:
# Сервис генерации файлов
file_generator:
build:
# Директория с Dockerfile и скриптом генератора
context: ./file_generator
dockerfile: Dockerfile
# Монтирование локальной папки data в /var/data в контейнере
volumes:
- ./data:/var/data
- ./result:/var/result
# Запуск команды, которая генерирует файл в папке /var/data
command: ["python", "file_generator.py"]
# Первая программа, которая перемещает рандомный файл из одной папки в другую
app1:
build:
# Директория с Dockerfile для первого приложения
context: ./app1
dockerfile: Dockerfile
# Монтирование локальной папки result в /var/result в контейнере
volumes:
- ./result:/var/result
- ./data:/var/data
# Указывает, что первый сервис зависит от завершения работы генератора
depends_on:
- file_generator
# Запуск скрипта
command: ["python", "app1.py"]
# Вторая программа, которая считает квадрат максимального числа в файле (пояснения аналогичны первой)
app2:
build:
context: ./app2
dockerfile: Dockerfile
volumes:
- ./result:/var/result
- ./data:/var/data
depends_on:
- file_generator
command: ["python", "app2.py"]

View File

@ -0,0 +1,7 @@
FROM python:3.9
WORKDIR /app
COPY file_generator.py .
CMD [ "python", "file_generator.py" ]

View File

@ -0,0 +1,33 @@
import os
import random
def generate_files(count):
directory = "/var/data/"
if not os.path.exists(directory):
os.makedirs(directory)
for _ in range(count):
file_name = f"{directory}file_{random.randint(1, 10)}.txt"
with open(file_name, 'w') as f:
for _ in range(random.randint(1, 100)):
f.write(f"{random.randint(1, 100)}\n")
print(f"Сгенерирован файл {file_name}")
def generate_data():
file_name = "/var/data/data.txt"
with open(file_name, 'w') as f:
for _ in range(random.randint(10, 100)):
f.write(f"{random.randint(1, 30)}\n")
print(f"Сгенерирован файл {file_name}")
if __name__ == "__main__":
generate_files(10)
generate_data()