diff --git a/tukaeva_alfiya_lab_2_fix/.gitignore b/tukaeva_alfiya_lab_2_fix/.gitignore new file mode 100644 index 0000000..cc114d2 --- /dev/null +++ b/tukaeva_alfiya_lab_2_fix/.gitignore @@ -0,0 +1,2 @@ +result/ +data/ \ No newline at end of file diff --git a/tukaeva_alfiya_lab_2_fix/README.md b/tukaeva_alfiya_lab_2_fix/README.md new file mode 100644 index 0000000..7465522 --- /dev/null +++ b/tukaeva_alfiya_lab_2_fix/README.md @@ -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 \ No newline at end of file diff --git a/tukaeva_alfiya_lab_2_fix/app_1/Dockerfile b/tukaeva_alfiya_lab_2_fix/app_1/Dockerfile new file mode 100644 index 0000000..bf59362 --- /dev/null +++ b/tukaeva_alfiya_lab_2_fix/app_1/Dockerfile @@ -0,0 +1,8 @@ +FROM python:latest + + +WORKDIR /app + +COPY app_1.py /app/ + +CMD ["python", "app_1.py"] \ No newline at end of file diff --git a/tukaeva_alfiya_lab_2_fix/app_1/app_1.py b/tukaeva_alfiya_lab_2_fix/app_1/app_1.py new file mode 100644 index 0000000..712bd99 --- /dev/null +++ b/tukaeva_alfiya_lab_2_fix/app_1/app_1.py @@ -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') \ No newline at end of file diff --git a/tukaeva_alfiya_lab_2_fix/app_2/Dockerfile b/tukaeva_alfiya_lab_2_fix/app_2/Dockerfile new file mode 100644 index 0000000..df8405d --- /dev/null +++ b/tukaeva_alfiya_lab_2_fix/app_2/Dockerfile @@ -0,0 +1,8 @@ +FROM python:latest + + +WORKDIR /app + +COPY app_2.py /app/ + +CMD ["python","app_2.py"] \ No newline at end of file diff --git a/tukaeva_alfiya_lab_2_fix/app_2/app_2.py b/tukaeva_alfiya_lab_2_fix/app_2/app_2.py new file mode 100644 index 0000000..9e5fbed --- /dev/null +++ b/tukaeva_alfiya_lab_2_fix/app_2/app_2.py @@ -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') diff --git a/tukaeva_alfiya_lab_2_fix/docker-compose.yml b/tukaeva_alfiya_lab_2_fix/docker-compose.yml new file mode 100644 index 0000000..3ce6200 --- /dev/null +++ b/tukaeva_alfiya_lab_2_fix/docker-compose.yml @@ -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: + diff --git a/tukaeva_alfiya_lab_2_fix/generator/Dockerfile b/tukaeva_alfiya_lab_2_fix/generator/Dockerfile new file mode 100644 index 0000000..dec61e1 --- /dev/null +++ b/tukaeva_alfiya_lab_2_fix/generator/Dockerfile @@ -0,0 +1,11 @@ + +FROM python:latest + +# задание рабочей директории внутри контейнера. +WORKDIR /app + +# перемещение файлов из хоста в контейнер. +COPY generate_files.py /app/ + +# команда, выполняющаяся при запуске контейнера. +CMD ["python", "generate_files.py"] \ No newline at end of file diff --git a/tukaeva_alfiya_lab_2_fix/generator/generate_files.py b/tukaeva_alfiya_lab_2_fix/generator/generate_files.py new file mode 100644 index 0000000..1ffdca2 --- /dev/null +++ b/tukaeva_alfiya_lab_2_fix/generator/generate_files.py @@ -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) diff --git a/tukaeva_alfiya_lab_2_fix/lab_2.1.png b/tukaeva_alfiya_lab_2_fix/lab_2.1.png new file mode 100644 index 0000000..afba2cc Binary files /dev/null and b/tukaeva_alfiya_lab_2_fix/lab_2.1.png differ diff --git a/tukaeva_alfiya_lab_2_fix/lab_2.2.png b/tukaeva_alfiya_lab_2_fix/lab_2.2.png new file mode 100644 index 0000000..9c0ff84 Binary files /dev/null and b/tukaeva_alfiya_lab_2_fix/lab_2.2.png differ diff --git a/tukaeva_alfiya_lab_2_fix/lab_2.3.png b/tukaeva_alfiya_lab_2_fix/lab_2.3.png new file mode 100644 index 0000000..e8a5cf4 Binary files /dev/null and b/tukaeva_alfiya_lab_2_fix/lab_2.3.png differ