From 20acae9135da7a5643fb08bf67dd975530afbe19 Mon Sep 17 00:00:00 2001 From: m1aksim1 Date: Mon, 11 Nov 2024 23:34:00 +0400 Subject: [PATCH 1/2] kosheev_maksim_lab_2 is ready --- kosheev_maksim_lab_2/.gitignote | 0 kosheev_maksim_lab_2/README.md | 0 kosheev_maksim_lab_2/data_generator/Dockerfile | 11 +++++++++++ .../data_generator/generate_data.py | 0 kosheev_maksim_lab_2/docker-compose.yml | 0 kosheev_maksim_lab_2/worker-1/Dockerfile | 0 kosheev_maksim_lab_2/worker-1/main.py | 0 kosheev_maksim_lab_2/worker-2/Dockerfile | 11 +++++++++++ kosheev_maksim_lab_2/worker-2/main.py | 16 ++++++++++++++++ 9 files changed, 38 insertions(+) create mode 100644 kosheev_maksim_lab_2/.gitignote create mode 100644 kosheev_maksim_lab_2/README.md create mode 100644 kosheev_maksim_lab_2/data_generator/Dockerfile create mode 100644 kosheev_maksim_lab_2/data_generator/generate_data.py create mode 100644 kosheev_maksim_lab_2/docker-compose.yml create mode 100644 kosheev_maksim_lab_2/worker-1/Dockerfile create mode 100644 kosheev_maksim_lab_2/worker-1/main.py create mode 100644 kosheev_maksim_lab_2/worker-2/Dockerfile create mode 100644 kosheev_maksim_lab_2/worker-2/main.py diff --git a/kosheev_maksim_lab_2/.gitignote b/kosheev_maksim_lab_2/.gitignote new file mode 100644 index 0000000..e69de29 diff --git a/kosheev_maksim_lab_2/README.md b/kosheev_maksim_lab_2/README.md new file mode 100644 index 0000000..e69de29 diff --git a/kosheev_maksim_lab_2/data_generator/Dockerfile b/kosheev_maksim_lab_2/data_generator/Dockerfile new file mode 100644 index 0000000..7410963 --- /dev/null +++ b/kosheev_maksim_lab_2/data_generator/Dockerfile @@ -0,0 +1,11 @@ +# Используем Python-образ +FROM python:3.9 + +# Копируем скрипт генерации данных +COPY generate_data.py /app/generate_data.py + +# Устанавливаем рабочую директорию +WORKDIR /app + +# Запускаем скрипт +ENTRYPOINT ["python", "generate_data.py"] \ No newline at end of file diff --git a/kosheev_maksim_lab_2/data_generator/generate_data.py b/kosheev_maksim_lab_2/data_generator/generate_data.py new file mode 100644 index 0000000..e69de29 diff --git a/kosheev_maksim_lab_2/docker-compose.yml b/kosheev_maksim_lab_2/docker-compose.yml new file mode 100644 index 0000000..e69de29 diff --git a/kosheev_maksim_lab_2/worker-1/Dockerfile b/kosheev_maksim_lab_2/worker-1/Dockerfile new file mode 100644 index 0000000..e69de29 diff --git a/kosheev_maksim_lab_2/worker-1/main.py b/kosheev_maksim_lab_2/worker-1/main.py new file mode 100644 index 0000000..e69de29 diff --git a/kosheev_maksim_lab_2/worker-2/Dockerfile b/kosheev_maksim_lab_2/worker-2/Dockerfile new file mode 100644 index 0000000..5a4af21 --- /dev/null +++ b/kosheev_maksim_lab_2/worker-2/Dockerfile @@ -0,0 +1,11 @@ +# Используем образ Python +FROM python:3.9-slim + +# Создаем рабочий каталог +WORKDIR /app + +# Копируем скрипт в контейнер +COPY main.py . + +# Команда для запуска программы +CMD ["python", "main.py"] \ No newline at end of file diff --git a/kosheev_maksim_lab_2/worker-2/main.py b/kosheev_maksim_lab_2/worker-2/main.py new file mode 100644 index 0000000..4c02deb --- /dev/null +++ b/kosheev_maksim_lab_2/worker-2/main.py @@ -0,0 +1,16 @@ +import os + +input_dir = '/var/data' +output_file = '/var/result/data.txt' + +def get_first_line_from_files(input_directory, output_path): + with open(output_path, 'w') as outfile: + for filename in os.listdir(input_directory): + file_path = os.path.join(input_directory, filename) + if os.path.isfile(file_path): + with open(file_path, 'r') as infile: + first_line = infile.readline().strip() + outfile.write(first_line + '\n') + +if __name__ == "__main__": + get_first_line_from_files(input_dir, output_file) \ No newline at end of file From 88e8fd7b6aaed1b4cde4c99fae0af46042aa8100 Mon Sep 17 00:00:00 2001 From: m1aksim1 Date: Mon, 11 Nov 2024 23:36:39 +0400 Subject: [PATCH 2/2] kosheev_maksim_lab_2 is ready_2 --- kosheev_maksim_lab_2/.gitignote | 2 + kosheev_maksim_lab_2/README.md | 38 ++++++++ kosheev_maksim_lab_2/data/data.txt | 4 + kosheev_maksim_lab_2/data/random_file_1.txt | 42 +++++++++ kosheev_maksim_lab_2/data/random_file_2.txt | 89 +++++++++++++++++++ .../data_generator/Dockerfile | 17 ++-- .../data_generator/generate_data.py | 34 +++++++ kosheev_maksim_lab_2/docker-compose.yml | 28 ++++++ kosheev_maksim_lab_2/result/data.txt | 3 + kosheev_maksim_lab_2/result/result.txt | 1 + kosheev_maksim_lab_2/worker-1/Dockerfile | 11 +++ kosheev_maksim_lab_2/worker-1/main.py | 16 ++++ kosheev_maksim_lab_2/worker-2/main.py | 24 +++-- 13 files changed, 289 insertions(+), 20 deletions(-) create mode 100644 kosheev_maksim_lab_2/data/data.txt create mode 100644 kosheev_maksim_lab_2/data/random_file_1.txt create mode 100644 kosheev_maksim_lab_2/data/random_file_2.txt create mode 100644 kosheev_maksim_lab_2/result/data.txt create mode 100644 kosheev_maksim_lab_2/result/result.txt diff --git a/kosheev_maksim_lab_2/.gitignote b/kosheev_maksim_lab_2/.gitignote index e69de29..95c33a4 100644 --- a/kosheev_maksim_lab_2/.gitignote +++ b/kosheev_maksim_lab_2/.gitignote @@ -0,0 +1,2 @@ +result +data \ No newline at end of file diff --git a/kosheev_maksim_lab_2/README.md b/kosheev_maksim_lab_2/README.md index e69de29..11a2e1a 100644 --- a/kosheev_maksim_lab_2/README.md +++ b/kosheev_maksim_lab_2/README.md @@ -0,0 +1,38 @@ +# Лабораторная работа №2 - Разработка простейшего распределённого приложения + +## Задание +Разработать два приложения такие, что результат первого является исходными данными для второго. +Собрать файл `docker-compose.yml` для запуска приложений. Изучить файлы сборки образов Docker и создать их для разработанных приложений, корректно закоммитить решение. + +## Варианты задания +1. **worker-1** - Формирует файл `/var/result/data.txt` из первых строк всех файлов каталога +2. **worker-2** - Ищет набольшее число из файла `/var/data/data.txt` и сохраняет его вторую степень в `/var/result/result.txt`. + +## Запуск + +## Запуск работы + +1. Убедиться, что установлены необходимые технологии: + - Docker: Платформа для контейнеризации приложений. + - Docker Compose: Инструмент для запуска многоконтейнерных приложений на основе `docker-compose.yaml`. Обычно поставляется вместе с Docker. Чтобы проверить, установлена ли утилита, нужно запустить команду: +```bash + docker-compose --version +``` + +2. В директории, где находится файл `docker-compose.yaml`, выполнить следующую команду для запуска всех сервисов: +```bash + docker-compose up --build +``` +Эта команда сначала выполнит сборку, а затем запустит контейнеры. + +3. После успешного запуска можно перейти в каталог проекта и увидеть папку data со сгенерированными файлами и папку result, в которой два текстовых файла: + - data.txt - файл, полученный после выполнения первой программы. + - result.txt -файл, полученный после выполнения второй программы. + +## Описание работы: + +Для разработки приложений был выбран язык программирования - ```python``` +Построчное описание docker-compose.yaml и других файлов выполнено в самих файлах. + +## [Видео](https://disk.yandex.ru/i/IRM2gmjud4hj9w) + diff --git a/kosheev_maksim_lab_2/data/data.txt b/kosheev_maksim_lab_2/data/data.txt new file mode 100644 index 0000000..980e3ca --- /dev/null +++ b/kosheev_maksim_lab_2/data/data.txt @@ -0,0 +1,4 @@ +490 +198 +76 +550 diff --git a/kosheev_maksim_lab_2/data/random_file_1.txt b/kosheev_maksim_lab_2/data/random_file_1.txt new file mode 100644 index 0000000..b5a0dc6 --- /dev/null +++ b/kosheev_maksim_lab_2/data/random_file_1.txt @@ -0,0 +1,42 @@ +233 +92 +225 +823 +302 +606 +564 +980 +312 +744 +10 +261 +808 +364 +642 +712 +815 +250 +547 +147 +708 +166 +228 +678 +831 +521 +314 +764 +230 +547 +85 +611 +139 +707 +743 +761 +168 +166 +229 +315 +765 +356 diff --git a/kosheev_maksim_lab_2/data/random_file_2.txt b/kosheev_maksim_lab_2/data/random_file_2.txt new file mode 100644 index 0000000..2aa865b --- /dev/null +++ b/kosheev_maksim_lab_2/data/random_file_2.txt @@ -0,0 +1,89 @@ +711 +154 +141 +610 +133 +704 +335 +429 +743 +77 +843 +329 +805 +536 +303 +927 +392 +640 +947 +488 +664 +716 +815 +611 +338 +686 +212 +512 +896 +450 +378 +752 +48 +910 +240 +514 +513 +933 +266 +465 +949 +362 +496 +646 +359 +638 +938 +255 +17 +339 +598 +343 +148 +896 +16 +151 +954 +530 +920 +954 +70 +734 +596 +632 +549 +628 +514 +311 +685 +496 +735 +21 +756 +132 +830 +620 +779 +447 +701 +222 +553 +857 +742 +79 +852 +453 +481 +3 +412 diff --git a/kosheev_maksim_lab_2/data_generator/Dockerfile b/kosheev_maksim_lab_2/data_generator/Dockerfile index 7410963..52e9a71 100644 --- a/kosheev_maksim_lab_2/data_generator/Dockerfile +++ b/kosheev_maksim_lab_2/data_generator/Dockerfile @@ -1,11 +1,14 @@ -# Используем Python-образ -FROM python:3.9 - -# Копируем скрипт генерации данных -COPY generate_data.py /app/generate_data.py +# Используем базовый образ Python +FROM python:3.9-slim # Устанавливаем рабочую директорию WORKDIR /app -# Запускаем скрипт -ENTRYPOINT ["python", "generate_data.py"] \ No newline at end of file +# Копируем скрипт генератора +COPY generate_data.py . + +# Устанавливаем переменную среды для указания пути к файлу +ENV DATA_PATH=/var/data + +# Запуск скрипта генерации данных +CMD ["python", "generate_data.py"] \ No newline at end of file diff --git a/kosheev_maksim_lab_2/data_generator/generate_data.py b/kosheev_maksim_lab_2/data_generator/generate_data.py index e69de29..f8534eb 100644 --- a/kosheev_maksim_lab_2/data_generator/generate_data.py +++ b/kosheev_maksim_lab_2/data_generator/generate_data.py @@ -0,0 +1,34 @@ +import os +import random + +# Директория для генерации файлов +output_dir = '/var/data' +os.makedirs(output_dir, exist_ok=True) + +# Генерируем случайное количество файлов (1-15) +num_files = random.randint(1, 15) + +# Функция для генерации случайного файла +def generate_random_file(filename): + num_lines = random.randint(1, 100) + with open(filename, 'w') as f: + for _ in range(num_lines): + random_number = random.randint(0, 1000) + f.write(f"{random_number}\n") + +# Генерация нескольких случайных файлов +for i in range(num_files): + filename = os.path.join(output_dir, f'random_file_{i + 1}.txt') + generate_random_file(filename) + print(f"Генерация файла {filename} завершена.") + +# Дополнительно создаём файл data.txt со случайными числами +data_file = os.path.join(output_dir, 'data.txt') +with open(data_file, 'w') as f: + num_lines = random.randint(1, 100) + for _ in range(num_lines): + random_number = random.randint(0, 1000) + f.write(f"{random_number}\n") + +print(f"Файл {data_file} успешно сгенерирован с {num_lines} строками.") +print(f"Общее количество сгенерированных файлов: {num_files + 1}") \ No newline at end of file diff --git a/kosheev_maksim_lab_2/docker-compose.yml b/kosheev_maksim_lab_2/docker-compose.yml index e69de29..87009bb 100644 --- a/kosheev_maksim_lab_2/docker-compose.yml +++ b/kosheev_maksim_lab_2/docker-compose.yml @@ -0,0 +1,28 @@ +version: '3.8' + +services: + data-generator: + build: ./data_generator + volumes: + - ./data:/var/data + command: ["python", "generate_data.py"] + + worker1: + build: ./worker-1 + volumes: + - ./data:/var/data + - ./result:/var/result + depends_on: + - data-generator + + worker2: + build: ./worker-2 + volumes: + - ./data:/var/data + - ./result:/var/result + depends_on: + - worker1 + +volumes: + data: + result: \ No newline at end of file diff --git a/kosheev_maksim_lab_2/result/data.txt b/kosheev_maksim_lab_2/result/data.txt new file mode 100644 index 0000000..f4d0eaf --- /dev/null +++ b/kosheev_maksim_lab_2/result/data.txt @@ -0,0 +1,3 @@ +490 +233 +711 diff --git a/kosheev_maksim_lab_2/result/result.txt b/kosheev_maksim_lab_2/result/result.txt new file mode 100644 index 0000000..14e7a79 --- /dev/null +++ b/kosheev_maksim_lab_2/result/result.txt @@ -0,0 +1 @@ +302500 \ No newline at end of file diff --git a/kosheev_maksim_lab_2/worker-1/Dockerfile b/kosheev_maksim_lab_2/worker-1/Dockerfile index e69de29..5a4af21 100644 --- a/kosheev_maksim_lab_2/worker-1/Dockerfile +++ b/kosheev_maksim_lab_2/worker-1/Dockerfile @@ -0,0 +1,11 @@ +# Используем образ Python +FROM python:3.9-slim + +# Создаем рабочий каталог +WORKDIR /app + +# Копируем скрипт в контейнер +COPY main.py . + +# Команда для запуска программы +CMD ["python", "main.py"] \ No newline at end of file diff --git a/kosheev_maksim_lab_2/worker-1/main.py b/kosheev_maksim_lab_2/worker-1/main.py index e69de29..4c02deb 100644 --- a/kosheev_maksim_lab_2/worker-1/main.py +++ b/kosheev_maksim_lab_2/worker-1/main.py @@ -0,0 +1,16 @@ +import os + +input_dir = '/var/data' +output_file = '/var/result/data.txt' + +def get_first_line_from_files(input_directory, output_path): + with open(output_path, 'w') as outfile: + for filename in os.listdir(input_directory): + file_path = os.path.join(input_directory, filename) + if os.path.isfile(file_path): + with open(file_path, 'r') as infile: + first_line = infile.readline().strip() + outfile.write(first_line + '\n') + +if __name__ == "__main__": + get_first_line_from_files(input_dir, output_file) \ No newline at end of file diff --git a/kosheev_maksim_lab_2/worker-2/main.py b/kosheev_maksim_lab_2/worker-2/main.py index 4c02deb..080f2dd 100644 --- a/kosheev_maksim_lab_2/worker-2/main.py +++ b/kosheev_maksim_lab_2/worker-2/main.py @@ -1,16 +1,14 @@ -import os +input_file = '/var/data/data.txt' +output_file = '/var/result/result.txt' -input_dir = '/var/data' -output_file = '/var/result/data.txt' - -def get_first_line_from_files(input_directory, output_path): - with open(output_path, 'w') as outfile: - for filename in os.listdir(input_directory): - file_path = os.path.join(input_directory, filename) - if os.path.isfile(file_path): - with open(file_path, 'r') as infile: - first_line = infile.readline().strip() - outfile.write(first_line + '\n') +def find_square_of_max(input_path, output_path): + with open(input_path, 'r') as infile: + numbers = [int(line.strip()) for line in infile if line.strip().isdigit()] + if numbers: + max_number = max(numbers) + square_of_max = max_number ** 2 + with open(output_path, 'w') as outfile: + outfile.write(str(square_of_max)) if __name__ == "__main__": - get_first_line_from_files(input_dir, output_file) \ No newline at end of file + find_square_of_max(input_file, output_file) \ No newline at end of file