From 54f8d19f2db1a8153e80e2d3e13040624fd50ef8 Mon Sep 17 00:00:00 2001 From: Darya Date: Mon, 30 Dec 2024 22:42:02 +0400 Subject: [PATCH] agliullov_daniyar_lab_2 is ready --- agliullov_daniyar_lab_2/docker-compose.yml | 18 +++++++++ agliullov_daniyar_lab_2/readme.md | 35 ++++++++++++++++ agliullov_daniyar_lab_2/service_1/Dockerfile | 11 +++++ agliullov_daniyar_lab_2/service_1/main.py | 39 ++++++++++++++++++ agliullov_daniyar_lab_2/service_2/Dockerfile | 11 +++++ agliullov_daniyar_lab_2/service_2/main.py | 42 ++++++++++++++++++++ 6 files changed, 156 insertions(+) create mode 100644 agliullov_daniyar_lab_2/docker-compose.yml create mode 100644 agliullov_daniyar_lab_2/readme.md create mode 100644 agliullov_daniyar_lab_2/service_1/Dockerfile create mode 100644 agliullov_daniyar_lab_2/service_1/main.py create mode 100644 agliullov_daniyar_lab_2/service_2/Dockerfile create mode 100644 agliullov_daniyar_lab_2/service_2/main.py diff --git a/agliullov_daniyar_lab_2/docker-compose.yml b/agliullov_daniyar_lab_2/docker-compose.yml new file mode 100644 index 0000000..7b19fb0 --- /dev/null +++ b/agliullov_daniyar_lab_2/docker-compose.yml @@ -0,0 +1,18 @@ +# docker-compose.yml + +services: + service-1: + build: + context: ./service_1 + volumes: + - ./data:/var/data + - ./result:/var/result + + service-2: + build: + context: ./service_2 + volumes: + - ./data:/var/data + - ./result:/var/result + depends_on: + - service-1 diff --git a/agliullov_daniyar_lab_2/readme.md b/agliullov_daniyar_lab_2/readme.md new file mode 100644 index 0000000..b5e3f94 --- /dev/null +++ b/agliullov_daniyar_lab_2/readme.md @@ -0,0 +1,35 @@ +## Вариант 1 сервиса + 0. Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt. + +## Вариант 2 сервиса + 0. Сохраняет произведение первого и последнего числа из файла /var/data/data.txt в /var/result/result.txt. + +Для обоих приложений создадим Dockerfile. Вот пример для **service-1** файл для **service-2** будет идентичен, из-за одной версии питона и одного набора библеотек +(используются только стандартная библиотека): + + + +Пояснение: +- **Stage 1**: Мы используем `python:3.10-slim` как образ для сборки, где копируем файл `main.py` и устанавливаем зависимости, если это необходимо. +- **Stage 2**: В этом слое мы копируем скомпилированные файлы из предыдущего этапа и определяем команду для запуска приложения. + +Аналогичный Dockerfile будет для **service_2**. + +### Docker Compose файл + +Теперь нужно настроить файл `docker-compose.yml`, который позволит запустить оба приложения: + + + +Пояснение: +- **services**: Мы объявляем два сервиса — `service_1` и `service_2`. +- **build**: Указываем контекст сборки для каждого сервиса (директории, где находятся Dockerfile и код). +- **volumes**: Монтируем локальные директории `./data` и `./result` в контейнеры, чтобы обмениваться файлами между сервисами. +- **depends_on**: Задаем зависимость `service_2` от `service_1`, чтобы второй сервис запускался только после первого. + +### Заключение + +Это пример, как можно реализовать простейшее распределённое приложение с использованием Docker. Первое приложение генерирует данные для второго, который обрабатывает их и записывает результат в файл. Docker и Docker Compose позволяют легко управлять и изолировать каждое приложение.ker Compose для запуска двух программ, обрабатывающих данные в контейнерах. + + +[Видео](https://disk.yandex.ru/d/FFqx6_tdtX8s-g) \ No newline at end of file diff --git a/agliullov_daniyar_lab_2/service_1/Dockerfile b/agliullov_daniyar_lab_2/service_1/Dockerfile new file mode 100644 index 0000000..9531b64 --- /dev/null +++ b/agliullov_daniyar_lab_2/service_1/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.10-slim as builder + +WORKDIR /app +COPY ./main.py . + +FROM python:3.10-slim + +WORKDIR /app +COPY --from=builder /app/main.py . + +CMD ["python", "main.py"] diff --git a/agliullov_daniyar_lab_2/service_1/main.py b/agliullov_daniyar_lab_2/service_1/main.py new file mode 100644 index 0000000..447675c --- /dev/null +++ b/agliullov_daniyar_lab_2/service_1/main.py @@ -0,0 +1,39 @@ +import os +import shutil + +def find_largest_file(directory): + largest_file = None + largest_size = 0 + + # Проходим по всем файлам и подкаталогам в указанном каталоге + for dirpath, dirnames, filenames in os.walk(directory): + for filename in filenames: + filepath = os.path.join(dirpath, filename) + try: + # Получаем размер файла + file_size = os.path.getsize(filepath) + # Проверяем, является ли этот файл самым большим + if file_size > largest_size: + largest_size = file_size + largest_file = filepath + except OSError as e: + print(f"Ошибка при доступе к файлу {filepath}: {e}") + + return largest_file + +def main(): + source_directory = '/var/data' + destination_file = '/var/result/data.txt' + + largest_file = find_largest_file(source_directory) + + if largest_file: + print(f"Самый большой файл: {largest_file} ({os.path.getsize(largest_file)} байт)") + # Копируем самый большой файл в указанное место + shutil.copy(largest_file, destination_file) + print(f"Файл скопирован в: {destination_file}") + else: + print("Не найдено ни одного файла.") + +if __name__ == "__main__": + main() diff --git a/agliullov_daniyar_lab_2/service_2/Dockerfile b/agliullov_daniyar_lab_2/service_2/Dockerfile new file mode 100644 index 0000000..9531b64 --- /dev/null +++ b/agliullov_daniyar_lab_2/service_2/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.10-slim as builder + +WORKDIR /app +COPY ./main.py . + +FROM python:3.10-slim + +WORKDIR /app +COPY --from=builder /app/main.py . + +CMD ["python", "main.py"] diff --git a/agliullov_daniyar_lab_2/service_2/main.py b/agliullov_daniyar_lab_2/service_2/main.py new file mode 100644 index 0000000..571ceb6 --- /dev/null +++ b/agliullov_daniyar_lab_2/service_2/main.py @@ -0,0 +1,42 @@ +def read_numbers_from_file(file_path): + try: + with open(file_path, 'r') as file: + # Читаем все строки и преобразуем их в числа + numbers = [float(line.strip()) for line in file.read().split() if + line.strip().isdigit() or ( + line.strip().replace('.', '', 1).isdigit() and line.strip().count('.') < 2)] + return numbers + except FileNotFoundError: + print(f"Файл {file_path} не найден.") + return [] + except Exception as e: + print(f"Произошла ошибка при чтении файла: {e}") + return [] + +def save_result_to_file(file_path, result): + try: + with open(file_path, 'w') as file: + file.write(str(result)) + except Exception as e: + print(f"Произошла ошибка при записи в файл: {e}") + +def main(): + input_file = '/var/result/data.txt' + output_file = '/var/result/result.txt' + + numbers = read_numbers_from_file(input_file) + + if numbers: + first_number = numbers[0] + last_number = numbers[-1] + product = first_number * last_number + + print(f"Первое число: {first_number}, Последнее число: {last_number}, Произведение: {product}") + + save_result_to_file(output_file, product) + print(f"Результат сохранён в {output_file}") + else: + print("Не удалось получить числа из файла.") + +if __name__ == "__main__": + main()