From 1213b5db3c07bb36afeee53e95b2dde3008deb2e Mon Sep 17 00:00:00 2001 From: the Date: Fri, 4 Oct 2024 14:33:05 +0400 Subject: [PATCH 1/3] =?UTF-8?q?=D0=A7=D0=B8=D1=81=D1=82=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BF=D0=BE=D0=B4=D0=BA=D1=83=D0=BF=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D0=B9=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=202-=D0=B9=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BD=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bogdanov_dmitry_lab_2/.gitignore | 2 ++ bogdanov_dmitry_lab_2/app-1/Dockerfile | 7 +++++ bogdanov_dmitry_lab_2/app-1/app.py | 22 ++++++++++++++++ bogdanov_dmitry_lab_2/app-2/Dockerfile | 7 +++++ bogdanov_dmitry_lab_2/app-2/app.py | 15 +++++++++++ .../app-generator/Dockerfile | 7 +++++ .../app-generator/generator.py | 26 +++++++++++++++++++ bogdanov_dmitry_lab_2/docker-compose.yaml | 24 +++++++++++++++++ 8 files changed, 110 insertions(+) create mode 100644 bogdanov_dmitry_lab_2/.gitignore create mode 100644 bogdanov_dmitry_lab_2/app-1/Dockerfile create mode 100644 bogdanov_dmitry_lab_2/app-1/app.py create mode 100644 bogdanov_dmitry_lab_2/app-2/Dockerfile create mode 100644 bogdanov_dmitry_lab_2/app-2/app.py create mode 100644 bogdanov_dmitry_lab_2/app-generator/Dockerfile create mode 100644 bogdanov_dmitry_lab_2/app-generator/generator.py create mode 100644 bogdanov_dmitry_lab_2/docker-compose.yaml diff --git a/bogdanov_dmitry_lab_2/.gitignore b/bogdanov_dmitry_lab_2/.gitignore new file mode 100644 index 0000000..6f12951 --- /dev/null +++ b/bogdanov_dmitry_lab_2/.gitignore @@ -0,0 +1,2 @@ +data/ +result/ \ No newline at end of file diff --git a/bogdanov_dmitry_lab_2/app-1/Dockerfile b/bogdanov_dmitry_lab_2/app-1/Dockerfile new file mode 100644 index 0000000..8e7da3d --- /dev/null +++ b/bogdanov_dmitry_lab_2/app-1/Dockerfile @@ -0,0 +1,7 @@ +FROM python:latest + +WORKDIR /app + +COPY app.py /app/ + +CMD ["python", "app.py"] \ No newline at end of file diff --git a/bogdanov_dmitry_lab_2/app-1/app.py b/bogdanov_dmitry_lab_2/app-1/app.py new file mode 100644 index 0000000..0257075 --- /dev/null +++ b/bogdanov_dmitry_lab_2/app-1/app.py @@ -0,0 +1,22 @@ +import os + +# Variant 2 +def solve(dir_files, dir_result, filename_result): + filenames = os.listdir(dir_files) + result = '' + for filename in filenames: + filepath = os.path.join(dir_files, filename) + file = open(filepath, "r") + result += f"{file.readline()}" + file.close() + + if not os.path.exists(dir_result): + os.makedirs(dir_result) + if os.listdir(dir_result): + return + result_file = open(os.path.join(dir_result, filename_result), "w") + result_file.write(result) + result_file.close() + +if __name__ == "__main__": + solve('/var/data', '/var/result', 'data.txt') \ No newline at end of file diff --git a/bogdanov_dmitry_lab_2/app-2/Dockerfile b/bogdanov_dmitry_lab_2/app-2/Dockerfile new file mode 100644 index 0000000..8e7da3d --- /dev/null +++ b/bogdanov_dmitry_lab_2/app-2/Dockerfile @@ -0,0 +1,7 @@ +FROM python:latest + +WORKDIR /app + +COPY app.py /app/ + +CMD ["python", "app.py"] \ No newline at end of file diff --git a/bogdanov_dmitry_lab_2/app-2/app.py b/bogdanov_dmitry_lab_2/app-2/app.py new file mode 100644 index 0000000..e5ea411 --- /dev/null +++ b/bogdanov_dmitry_lab_2/app-2/app.py @@ -0,0 +1,15 @@ +import os + +# Variant 1 +def solve(dir_input, dir_result, filename_result): + file_input = open(os.path.join(dir_input, 'data.txt')) + + inputs = [int(line) for line in file_input.readlines()] + if inputs: + result = max(inputs) ** 2 + file_result = open(os.path.join(dir_result, filename_result), "w") + file_result.write(str(result)) + file_result.close() + +if __name__ == "__main__": + solve("/var/result", '/var/result', 'result.txt') \ No newline at end of file diff --git a/bogdanov_dmitry_lab_2/app-generator/Dockerfile b/bogdanov_dmitry_lab_2/app-generator/Dockerfile new file mode 100644 index 0000000..d58d177 --- /dev/null +++ b/bogdanov_dmitry_lab_2/app-generator/Dockerfile @@ -0,0 +1,7 @@ +FROM python:latest + +WORKDIR /app + +COPY generator.py /app/ + +CMD ["python", "generate_files.py"] \ No newline at end of file diff --git a/bogdanov_dmitry_lab_2/app-generator/generator.py b/bogdanov_dmitry_lab_2/app-generator/generator.py new file mode 100644 index 0000000..1e1954a --- /dev/null +++ b/bogdanov_dmitry_lab_2/app-generator/generator.py @@ -0,0 +1,26 @@ +import os +import random as rnd +import string + + +def generate_filename(l): + return ''.join(rnd.choices(string.ascii_lowercase + string.digits, k=l)) + '.txt' + +def generate_files(dir, num_files, num_lines): + if not os.path.exists(dir): + os.makedirs(dir) + + if os.listdir(dir): + return + + for i in range(num_files): + filename = generate_filename(20) + filepath = os.path.join(dir, filename) + + file = open(filepath, "w") + for j in range(num_lines): + file.write(f"{rnd.randint(-1000, 1000)}\n") + file.close() + +if __name__ == "__main__": + generate_files('/var/data', 50, 50) \ No newline at end of file diff --git a/bogdanov_dmitry_lab_2/docker-compose.yaml b/bogdanov_dmitry_lab_2/docker-compose.yaml new file mode 100644 index 0000000..66dbd6f --- /dev/null +++ b/bogdanov_dmitry_lab_2/docker-compose.yaml @@ -0,0 +1,24 @@ +services: + generator: + build: + context: ./app-generator + volumes: + - ./data:/var/data + entrypoint: python generator.py + + app1: + build: + context: ./app-1 + volumes: + - ./data:/var/data + - ./result:/var/result + depends_on: + - generator + + app2: + build: + context: ./app-2 + volumes: + - ./result:/var/result + depends_on: + - app1 \ No newline at end of file From d8441a0989eee0295a5d70655283c810e5dcf548 Mon Sep 17 00:00:00 2001 From: the Date: Fri, 4 Oct 2024 15:49:14 +0400 Subject: [PATCH 2/3] =?UTF-8?q?=D0=A7=D0=B8=D1=81=D1=82=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BF=D0=BE=D0=B4=D0=BA=D1=83=D0=BF=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D0=B9=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=202-=D0=B9=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BD=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bogdanov_dmitry_lab_2/README.md | 41 +++++++++++++++++++ bogdanov_dmitry_lab_2/app-1/app.py | 12 +++++- bogdanov_dmitry_lab_2/app-2/app.py | 10 ++++- .../app-generator/generator.py | 6 ++- bogdanov_dmitry_lab_2/docker-compose.yaml | 15 ++++--- 5 files changed, 73 insertions(+), 11 deletions(-) create mode 100644 bogdanov_dmitry_lab_2/README.md diff --git a/bogdanov_dmitry_lab_2/README.md b/bogdanov_dmitry_lab_2/README.md new file mode 100644 index 0000000..a624d0e --- /dev/null +++ b/bogdanov_dmitry_lab_2/README.md @@ -0,0 +1,41 @@ +# Лабораторная работа №2 + +## Богданов Дмитрий ПИбд-42 + +### Для выполнения была проделана следующая работа: +Были написаны и развернуты 3 сервиса: генератор файлов, 2 приложения для работы с этими файлами по вариантам 2 и 1 соответственно: + +Вариант 2 (для первого приложения): + +```Формирует файл /var/result/data.txt из первых строк всех файлов каталога /var/data.``` + +Вариант 1 (для второго приложения): + +```Формирует файл /var/result/data.txt из первых строк всех файлов каталога /var/data.``` + +Приложения работают совместно, используя общий монтированный том как источник информации: +``` + volumes: + - ./data:/var/data +``` +``` + volumes: + - ./data:/var/data + - ./result:/var/result +``` +``` + volumes: + - ./result:/var/result +``` + + +### Запуск лабораторной: +Необходимо перейти в папку с файлом docker-compose.yaml и ввести следующую команду: +``` +docker compose up --build +``` +Сервис генератора сгенерирует папки data и result, где будут сгенерированы входные файлы и файл-результат их обработки соответственно. + +## Видео с результатом запуска: + +Видео-демонстрацию работы можно посмотреть по данной [ссылке](https://drive.google.com/file/d/1CmVZjJuMStqNFFKbsMLjw4ihTiMnR7it/view). \ No newline at end of file diff --git a/bogdanov_dmitry_lab_2/app-1/app.py b/bogdanov_dmitry_lab_2/app-1/app.py index 0257075..198331a 100644 --- a/bogdanov_dmitry_lab_2/app-1/app.py +++ b/bogdanov_dmitry_lab_2/app-1/app.py @@ -1,21 +1,29 @@ import os -# Variant 2 +# Вариант 2 - Формирует файл /var/result/data.txt из первых строк всех файлов каталога /var/data. def solve(dir_files, dir_result, filename_result): + # Получаем список файлов в директории filenames = os.listdir(dir_files) result = '' + # Проходим через каждый файл for filename in filenames: filepath = os.path.join(dir_files, filename) file = open(filepath, "r") + # Читаем первую строку, добавляем к результату result += f"{file.readline()}" file.close() + # Если директории для сохранения результата нет - создаём if not os.path.exists(dir_result): os.makedirs(dir_result) + # Если директория с результатом не пустая - завершаем работу if os.listdir(dir_result): return - result_file = open(os.path.join(dir_result, filename_result), "w") + # Пишем результат в файл + filepath_result = os.path.join(dir_result, filename_result) + result_file = open(filepath_result, "w") result_file.write(result) + print(f"Результат записан в файл {filepath_result}") result_file.close() if __name__ == "__main__": diff --git a/bogdanov_dmitry_lab_2/app-2/app.py b/bogdanov_dmitry_lab_2/app-2/app.py index e5ea411..d401506 100644 --- a/bogdanov_dmitry_lab_2/app-2/app.py +++ b/bogdanov_dmitry_lab_2/app-2/app.py @@ -1,14 +1,20 @@ import os -# Variant 1 +# Вариант 1 - Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt. def solve(dir_input, dir_result, filename_result): file_input = open(os.path.join(dir_input, 'data.txt')) - + # Считываем все числа из файла inputs = [int(line) for line in file_input.readlines()] if inputs: + # Максимальное число + max_num = max(inputs) + print(f"Наибольшее число: {max_num}") + # Возводим во 2 степень result = max(inputs) ** 2 file_result = open(os.path.join(dir_result, filename_result), "w") + # Пишем результат в файл file_result.write(str(result)) + print(f"Получен результат {result}") file_result.close() if __name__ == "__main__": diff --git a/bogdanov_dmitry_lab_2/app-generator/generator.py b/bogdanov_dmitry_lab_2/app-generator/generator.py index 1e1954a..e7d2035 100644 --- a/bogdanov_dmitry_lab_2/app-generator/generator.py +++ b/bogdanov_dmitry_lab_2/app-generator/generator.py @@ -2,22 +2,26 @@ import os import random as rnd import string - +# Генератор названий файлов def generate_filename(l): return ''.join(rnd.choices(string.ascii_lowercase + string.digits, k=l)) + '.txt' def generate_files(dir, num_files, num_lines): + # Если директории для сохранения файлов нет - создаём if not os.path.exists(dir): os.makedirs(dir) + # Если директория для сохранения файлов не пустая - завершаем работу if os.listdir(dir): return + # Создание файлов for i in range(num_files): filename = generate_filename(20) filepath = os.path.join(dir, filename) file = open(filepath, "w") + # Запись строк в файл for j in range(num_lines): file.write(f"{rnd.randint(-1000, 1000)}\n") file.close() diff --git a/bogdanov_dmitry_lab_2/docker-compose.yaml b/bogdanov_dmitry_lab_2/docker-compose.yaml index 66dbd6f..3542011 100644 --- a/bogdanov_dmitry_lab_2/docker-compose.yaml +++ b/bogdanov_dmitry_lab_2/docker-compose.yaml @@ -1,20 +1,23 @@ services: + # Генератор файлов generator: build: - context: ./app-generator + context: ./app-generator # Путь к контексту (докер файл + скрипт) volumes: - - ./data:/var/data - entrypoint: python generator.py + - ./data:/var/data # Папка контейнера : папка локальная + entrypoint: python generator.py # Точка входа + # Первое приложение app1: build: - context: ./app-1 + context: ./app-1 # Путь к контексту volumes: - - ./data:/var/data + - ./data:/var/data # Монтирование папок - ./result:/var/result depends_on: - - generator + - generator # Указываем, что запускается только после успешной работы сервиса generator + # Второе приложение, настройка аналогична сервисам выше app2: build: context: ./app-2 From 75b118ba6e1f02d711ce71140ef386c39dae8988 Mon Sep 17 00:00:00 2001 From: the Date: Fri, 4 Oct 2024 15:52:10 +0400 Subject: [PATCH 3/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20README,=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bogdanov_dmitry_lab_2/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bogdanov_dmitry_lab_2/README.md b/bogdanov_dmitry_lab_2/README.md index a624d0e..1834bb3 100644 --- a/bogdanov_dmitry_lab_2/README.md +++ b/bogdanov_dmitry_lab_2/README.md @@ -11,9 +11,9 @@ Вариант 1 (для второго приложения): -```Формирует файл /var/result/data.txt из первых строк всех файлов каталога /var/data.``` +```Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt.``` -Приложения работают совместно, используя общий монтированный том как источник информации: +Приложения работают совместно, используя общий монтированный том для записи и получения информации: ``` volumes: - ./data:/var/data