Merge pull request 'tukaeva_alfiya_lab_2_fix' (#36) from tukaeva_alfiya_lab_2_fix into main

Reviewed-on: #36
This commit is contained in:
Alexey 2024-10-07 23:06:38 +04:00
commit 129b991712
12 changed files with 196 additions and 0 deletions

2
tukaeva_alfiya_lab_2_fix/.gitignore vendored Normal file
View File

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

View File

@ -0,0 +1,38 @@
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
## Задание
* Согласно вашему варианту разработать два приложения такие, что результат первого является исходными данными для второго.
* Изучить файлы сборки образов docker и разработать их для созданных приложений.
* Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
## Выбранные варианты:
 1. Формирует файл /var/result/data.txt так, что каждая строка файла - количество символов в именах файлов из каталога /var/data.
 2. Ищет набольшее число из файла /var/result/data.txt и сохраняет количество таких чисел из последовательности в /var/result/result.txt.
## Запуск ЛР:
Введем в терминале команду:
```
docker compose up --build
```
После ввода данной команды происходит запуск файла generate_files.py.
Он формирует файлы в директории /var/result, которые нужны для работы приложений.
![](lab_2.1.png "")
Далее запускается первое приложение app_1.py. Оно считает количество символов в именах файлов, которые мы создали ранее, и записывает в файл /var/result/data.txt.
![](lab_2.2.png "")
После этого, запускается 2 приложение app_2.py. Оно Ищет набольшее число из файла /var/result/data.txt и сохраняет количество таких чисел из последовательности в файл /var/result/result.txt.
![](lab_2.3.png "")
# Видео
https://vk.com/video230744264_456239103?list=ln-8jtmxasFoP743qLzKB

View File

@ -0,0 +1,8 @@
FROM python:latest
WORKDIR /app
COPY app_1.py /app/
CMD ["python", "app_1.py"]

View File

@ -0,0 +1,27 @@
import os
def count_file_name_lengths(source_dir, result_file):
# Проверяем и создаем директорию для результатов
result_dir = os.path.dirname(result_file)
if not os.path.exists(result_dir):
os.makedirs(result_dir)
print(f"Created directory {result_dir}")
# Поиск файлов в исходной директории
files = [f for f in os.listdir(source_dir) if os.path.isfile(os.path.join(source_dir, f))]
# Если файлы не найдены, выводим сообщение
if not files:
print(f"No files found in {source_dir}")
return
# Запись длин имен файлов в result_file
with open(result_file, 'w') as f_out:
for file in files:
f_out.write(f"{len(file)}\n")
print(f"Wrote file name lengths to {result_file}")
if __name__ == '__main__':
count_file_name_lengths('/var/data', '/var/result/data.txt')

View File

@ -0,0 +1,8 @@
FROM python:latest
WORKDIR /app
COPY app_2.py /app/
CMD ["python","app_2.py"]

View File

@ -0,0 +1,34 @@
import os
def count_max_numbers(source_file, result_file):
# Проверяем и создаем директорию для результатов
result_dir = os.path.dirname(result_file)
if not os.path.exists(result_dir):
os.makedirs(result_dir)
print(f"Created directory {result_dir}")
# Чтение чисел из source_file
try:
with open(source_file, 'r') as f:
numbers = [int(line.strip()) for line in f if line.strip().isdigit()]
except FileNotFoundError:
print(f"File not found: {source_file}")
return
if not numbers:
print(f"No valid numbers found in {source_file}")
return
# Находим максимум
max_number = max(numbers)
max_count = numbers.count(max_number)
# Записываем количество максимальных чисел в result_file
with open(result_file, 'w') as f_out:
f_out.write(f"{max_count}")
print(f"Wrote count of max number {max_number} to {result_file}")
if __name__ == "__main__":
count_max_numbers('/var/result/data.txt', '/var/result/result.txt')

View File

@ -0,0 +1,33 @@
services:
generator:
build: ./generator
volumes:
- ./data:/var/data # Монтирование локальной папки data в /var/data в контейнере
entrypoint: ["sh", "-c", "if [ -z \"$(ls -A /var/data)\" ]; then python generate_files.py; else echo '/var/data is not empty'; fi"] # Запуск команды, проверяющей, пуста ли папка /var/data. Если пуста, запускается скрипт генерации данных.
app_1:
build: ./app_1
image: app_1
container_name: app_1
volumes:
- ./data:/var/data # Монтирование локальной папки data в /var/data
- ./result:/var/result # Монтирование локальной папки result в /var/result
depends_on:
- generator
app_2:
build: ./app_2
image: app_2
depends_on:
- app_1
container_name: app_2
volumes:
- shared-result:/var/result
- ./data:/var/data # Монтирование локальной папки data в /var/data
- ./result:/var/result # Монтирование локальной папки result в /var/result
volumes:
shared-result:

View File

@ -0,0 +1,11 @@
FROM python:latest
# задание рабочей директории внутри контейнера.
WORKDIR /app
# перемещение файлов из хоста в контейнер.
COPY generate_files.py /app/
# команда, выполняющаяся при запуске контейнера.
CMD ["python", "generate_files.py"]

View File

@ -0,0 +1,35 @@
import os
import random
import string
def generate_random_filename(length):
#Генерирует случайное имя файла с длиной length.
return ''.join(random.choices(string.ascii_lowercase + string.digits, k=length)) + '.txt'
def generate_data_files(directory, num_files, min_lines, max_lines):
# Создание директории, если таковой не существует
if not os.path.exists(directory):
os.makedirs(directory)
# Проверка, пустая ли директория
if os.listdir(directory):
print(f"{directory} is not empty, skipping file generation.")
return
# Генерация файлов
for _ in range(num_files):
file_name = generate_random_filename(random.randint(5, 20)) # Длина имени файла от 5 до 20
file_path = os.path.join(directory, file_name)
# Создание пустого файла
open(file_path, 'w').close() # Открываем файл в режиме записи и сразу закрываем
print(f"Generated file: {file_path}")
if __name__ == "__main__":
# Генерация случайных файлов данных в директории /var/data
generate_data_files('/var/data', num_files=random.randint(5, 15), min_lines=1, max_lines=50)

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB