DAS_2023_1/romanova_adelina_lab_2
2023-11-24 19:07:17 +04:00
..
data romanova_adelina_lab_2 is ready 2023-11-24 19:05:48 +04:00
result romanova_adelina_lab_2 is ready 2023-11-24 19:05:48 +04:00
worker_1 romanova_adelina_lab_2 is ready 2023-11-24 19:05:48 +04:00
worker_2 romanova_adelina_lab_2 is ready 2023-11-24 19:05:48 +04:00
1.png romanova_adelina_lab_2 is ready 2023-11-24 19:07:17 +04:00
2.png romanova_adelina_lab_2 is ready 2023-11-24 19:07:17 +04:00
docker-compose.yml romanova_adelina_lab_2 is ready 2023-11-24 19:05:48 +04:00
README.md romanova_adelina_lab_2 is ready 2023-11-24 19:05:48 +04:00

Лабораторная работа №2 - Разработка простейшего распределённого приложения

Задание

  • Разработать два приложения такие, что результат первого является исходными данными для второго.
  • Собрать файл docker-compose.yml для запуска приложений.

Изучить файлы сборки образов docker и разработать их для созданных приложений и правильно закоммитить решение

Варианты задания:

 1. worker_1 - ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt

 2. worker_2 - Сохраняет произведение первого и последнего числа из файла /var/data/data.txt в /var/result/result.txt

Запуск

Введение в терминале команды:

docker compose up --build

Описание работы:

Для разработки приложений был выбран язык программирования - python

Разработка приложения worker_1

worker_1 - ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt

Листинг кода:

import shutil

def find_largest_file(directory):
    files = os.listdir(directory)
    if not files:
        return None

    largest_file = max(files, key=lambda f: os.path.getsize(os.path.join(directory, f)))
    return largest_file

def main():
    data_dir = '/var/data'
    result_file = '/var/result/data.txt'
    largest_file = find_largest_file(data_dir)

    if largest_file:
        shutil.copy2(os.path.join(data_dir, largest_file), result_file)
    else:
        print('No files to copy.')

if __name__ == "__main__":
    main()

Листинг кода сборки образа Dockerfile

FROM python:3.11
WORKDIR /app
COPY . .
CMD ["python", "worker_1.py"]

WORKDIR /app:

Эта строка устанавливает рабочую директорию внутри контейнера в /app. Все последующие инструкции Docker будут выполняться в этой директории.

COPY ..

Эта строка копирует содержимое текущего каталога (где находится Dockerfile) внутрь контейнера в рабочую директорию /app.

CMD ["python", "worker_1.py"]:

Эта строка задает команду, которая будет выполнена при запуске контейнера. В данном случае, она запускает скрипт worker_1.py с использованием интерпретатора Python.

Разработка приложения worker_2

worker_2 - Сохраняет произведение первого и последнего числа из файла /var/data/data.txt в ```/var/result/result.txt`

Листинг кода:

def calculate_product_of_first_and_last_numbers(file_path):
    try:
        with open(file_path, 'r') as file:
            numbers = [int(line.strip()) for line in file.readlines()]

        if len(numbers) >= 2:
            product = numbers[0] * numbers[-1]
            print(f"Результат: {numbers[0]} * {numbers[-1]} = {product}")
            return product
        else:
            return None

    except Exception as e:
        return None

def main():
    input_file_path = "/var/data/data.txt"
    output_file_path = "/var/result/result.txt"

    result = calculate_product_of_first_and_last_numbers(input_file_path)

    if result is not None:
        with open(output_file_path, 'w') as output_file:
            output_file.write(str(result))
    else:
        print("No result to save.")

if __name__ == "__main__":
    main()

Листинг кода сборки образа Dockerfile

FROM python:3.11
WORKDIR /app
COPY . .
CMD ["python", "worker_2.py"]

Работа сборки образа происходит аналогично первой программе.

Формирование файла docker-compose.yml

 version: "3"
services:
  worker_1:
    build:
      context: ./worker_1
      dockerfile: Dockerfile
    volumes:
      - ./data:/var/data
      - ./result:/var/result

  worker_2:
    depends_on:
      - worker_1
    build:
      context: ./worker_2
      dockerfile: Dockerfile
    volumes:
      - ./result:/var/data
      - ./result:/var/result

build указывает на метод сборки образа в котором: context указывает на корневую директорию приложения, а dockerfile указывает на путь к Dockerfile, volumes устанавливает локальную папку data как папку входных файлов /var/data, а локальную папку result - как папку выходных файлов /var/result.

Исходные данные папки data

Содержание файла data_1.txt:

123
456
789

Содержание файла data_2.txt:

234
125
764
789

Содержание файла data_2.txt:

8903
324
232
233

Скриншоты работы

Успешно выполненная работа:

Работа Docker Desktop:

Youtube

https://youtu.be/WCKIk1zlH7o