Merge pull request 'minhasapov_ruslan_lab_2' (#193) from minhasapov_ruslan_lab_2 into main
Reviewed-on: #193
This commit is contained in:
commit
d70e738ef0
2
minhasapov_ruslan_lab_2/.gitignore
vendored
Normal file
2
minhasapov_ruslan_lab_2/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
data
|
||||
result
|
49
minhasapov_ruslan_lab_2/README.md
Normal file
49
minhasapov_ruslan_lab_2/README.md
Normal 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)
|
8
minhasapov_ruslan_lab_2/app_1/Dockerfile
Normal file
8
minhasapov_ruslan_lab_2/app_1/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
||||
# Образ с Python 3.12
|
||||
FROM python:3.12
|
||||
# Указываем рабочую директорию
|
||||
WORKDIR /app
|
||||
# Копируем в нее файл скрипта
|
||||
COPY app_1.py .
|
||||
# Команда запуска скрипта
|
||||
CMD ["python", "app_1.py"]
|
70
minhasapov_ruslan_lab_2/app_1/app_1.py
Normal file
70
minhasapov_ruslan_lab_2/app_1/app_1.py
Normal 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()
|
8
minhasapov_ruslan_lab_2/app_2/Dockerfile
Normal file
8
minhasapov_ruslan_lab_2/app_2/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
||||
# Образ с Python 3.12
|
||||
FROM python:3.12
|
||||
# Указываем рабочую директорию
|
||||
WORKDIR /app
|
||||
# Копируем в нее файл скрипта
|
||||
COPY app_2.py .
|
||||
# Команда запуска скрипта
|
||||
CMD ["python", "app_2.py"]
|
36
minhasapov_ruslan_lab_2/app_2/app_2.py
Normal file
36
minhasapov_ruslan_lab_2/app_2/app_2.py
Normal 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)
|
16
minhasapov_ruslan_lab_2/docker-compose.yaml
Normal file
16
minhasapov_ruslan_lab_2/docker-compose.yaml
Normal 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
|
Loading…
Reference in New Issue
Block a user