Merge pull request 'minhasapov_ruslan_lab_2' (#193) from minhasapov_ruslan_lab_2 into main

Reviewed-on: #193
This commit is contained in:
Alexey 2024-12-03 23:05:37 +04:00
commit d70e738ef0
7 changed files with 189 additions and 0 deletions

2
minhasapov_ruslan_lab_2/.gitignore vendored Normal file
View File

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

View File

@ -0,0 +1,49 @@
# Лабораторная работа №2
#### ПИбд-42. Минхасапов Руслан.
---
#### Задание:
В рамках выполнения данной лабораторной работы были выбраны следущие варианты программ:
- Программа 1. Вариант 6: Берёт из каталога /var/data случайный файл и перекладывает его в /var/result/data.txt.
- Программа 2. Вариант 2: Ищет наименьшее число из файла /var/data/data.txt и сохраняет его третью степень в /var/result/result.txt.
---
Исходя из условия задания: *разработать два приложения такие, что результат первого является исходными данными для второго*; - было принято решение для второй программы брать данные из файла */var/result/data.txt*
Помимо этого, для выполнения первой программы, было решено генерировать файлы в ней же.
---
#### При выполнении данной работы были использованы:
- Python 3.12
- Docker
- Docker Compose
---
#### Инструкция:
Для запуска необходимо перейдите в директорию *minhasapov_ruslan_lab_2* и выполнить команду:
```
docker-compose up --build
```
---
#### Результат
```
[+] Running 3/3
✔ Network minhasapov_ruslan_lab_2_default Created 0.1s
✔ Container minhasapov_ruslan_lab_2-app_1-1 Created 0.2s
✔ Container minhasapov_ruslan_lab_2-app_2-1 Created 0.1s
Attaching to app_1-1, app_2-1
app_1-1 | В директории /var/data было создано 18 файлов.
app_1-1 | Случайно выбранный файл file_1.txt был скопирован в /var/result/data.txt.
app_2-1 | Куб минимального числа (37^3) = 50653 сохранен в /var/result/result.txt.
app_1-1 exited with code 0
app_2-1 exited with code 0
```
#### Видео-демонстрация работы
Доступна по [ссылке](https://disk.yandex.ru/i/Z7Kvlm8dpNSzXg)

View File

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

View File

@ -0,0 +1,70 @@
import os
import random
import shutil
# Директории
source_dir = "/var/data" # Путь к исходной директории
destination_dir = "/var/result" # Путь к директории назначения
destination_file = os.path.join(destination_dir, "data.txt") # Путь к файлу назначения
# Генерация случайного количества файлов со случайными числами
def generate_random_files(directory):
# Создаем директорию, если она не существует, игнорируя ошибку, если она уже есть
os.makedirs(directory, exist_ok=True)
# Генерируем случайное количество файлов
amount_files = random.randint(10, 20)
# Создаем каждый файл
for i in range(1, amount_files + 1):
# Формируем путь к файлу
file_path = os.path.join(directory, f"file_{i}.txt")
# Генерируем случайное количество чисел в файле
amount_numbers = random.randint(1, 100)
# Генерируем список случайных чисел, преобразованных в строки
numbers = [str(random.randint(1, 100)) for _ in range(amount_numbers)]
# Записываем числа в файл
with open(file_path, "w") as f:
f.write("\n".join(numbers))
print(f"В директории {directory} было создано {amount_files} файлов.")
# Копирование случайного файла из исходной директории в файл
def copy_random_file(source_dir, destination_file):
# Создаем директорию назначения, если она не существует
os.makedirs(os.path.dirname(destination_file), exist_ok=True)
# Получаем список файлов в исходной директории
files = [
f
for f in os.listdir(source_dir)
if os.path.isfile(os.path.join(source_dir, f))
]
# Проверяем, есть ли файлы в исходной директории
if not files:
print("В исходном каталоге нет файлов.")
return
# Выбираем случайный файл из списка
random_file = random.choice(files)
# Формируем путь к исходному файлу
source_path = os.path.join(source_dir, random_file)
# Копируем выбранный файл в файл назначения
shutil.copy(source_path, destination_file)
print(f"Случайно выбранный файл {random_file} был скопирован в {destination_file}.")
def main():
generate_random_files(source_dir)
copy_random_file(source_dir, destination_file)
if __name__ == "__main__":
main()

View File

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

View File

@ -0,0 +1,36 @@
import os
# Пути к файлам
data_file = "/var/result/data.txt"
result_file = "/var/result/result.txt"
def calculate_cube(data_file, result_file):
try:
# Открываем файл и считываем строки
with open(data_file, 'r') as f:
numbers = f.readlines()
# Преобразуем строки в числа, игнорируя нечисловые значения
numbers = [int(num.strip()) for num in numbers if num.strip().isdigit()]
if not numbers:
print("Файл не содержит чисел.")
return
min_number = min(numbers)
cube = min_number ** 3
# Записываем результат в файл
with open(result_file, 'w') as f:
f.write(str(cube))
print(f"Куб минимального числа ({min_number}^3) = {cube} сохранен в {result_file}.")
except FileNotFoundError:
print(f"Файл {data_file} не найден.")
except ValueError:
print("Ошибка в данных файла. Убедитесь, что файл содержит только числа.")
if __name__ == "__main__":
calculate_cube(data_file, result_file)

View File

@ -0,0 +1,16 @@
services:
app_1: # Сервис с первой программой
build:
context: ./app_1/ # Указываем путь к директории программы и докер файла
volumes:
- ./data:/var/data # Монтируем локальную директорию с данными в /var/data
- ./result:/var/result # Монтируем локальную директорию с результирующими данными в /var/result
app_2: # Сервис со второй программой
depends_on:
- app_1 # Выполняем вторую программу после завершения первой
build:
context: ./app_2/
volumes:
- ./data:/var/data
- ./result:/var/result