lab_created

This commit is contained in:
2025-10-09 20:57:19 +04:00
parent de37e35815
commit 71ae4d913f
10 changed files with 149 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
# Лабораторная работа №2 — Разработка простейшего распределённого приложения
## 1. Цель работы
Изучение техники создания простого распределённого приложения с использованием Docker и docker-compose, включающего два связанных сервиса, где результат первого используется вторым.
## 2. Как запустить лабораторную работу
1. Перейдите в директорию с файлом `docker-compose.yml`:
2. Подготовьте входные файлы в подкаталоге `data` (например, `data/file1.txt`, `data/file2.txt`).
3. Выполните команду для сборки и запуска:
```bash
docker compose up --build
```
4. После завершения работы в терминале будет выведен результат (вторая степень максимального числа), а также файлы с результатами будут доступны в подкаталоге `result`.
## 3. Структура проекта
- `worker-1/` — Вариант 3. Формирует файл /var/result/data.txt так, что каждая строка файла - количество строк в файлах из каталога /var/data.
- `worker-2/` — Вариант1. Ищет наибольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt.
- `docker-compose.yml` — файл оркестрации Docker-контейнеров.
- `data/` — каталог с входными файлами.
- `result/` — каталог для результатов работы приложений.
## 4. Используемые технологии
1. Docker
2. Docker Compose
3. Python (для реализации логики приложений)
4. Язык описания `docker-compose.yml`
## 5. Видео
Ссылка на видео работы docker-compose [Rutube](https://rutube.ru/video/private/f316cf81845713abe9403cd268f751d8/?p=bdHp8GIWcnk0lGnGnECzdw)

View File

@@ -0,0 +1 @@
qwerty

View File

@@ -0,0 +1,3 @@
asdfg
zxcvb
12345

View File

@@ -0,0 +1,26 @@
version: '3.8'
services:
worker-1:
build:
context: ./worker-1
volumes:
- ./data:/var/data:ro
- ./result:/var/result
networks:
- shared-net
worker-2:
build:
context: ./worker-2
depends_on:
- worker-1
volumes:
- ./result:/var/data:ro
- ./result:/var/result
networks:
- shared-net
networks:
shared-net:
driver: bridge

View File

@@ -0,0 +1,2 @@
1
3

View File

@@ -0,0 +1 @@
9

View File

@@ -0,0 +1,7 @@
FROM python:3.11-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]

View File

@@ -0,0 +1,32 @@
import os
INPUT_DIR = "/var/data"
OUTPUT_FILE = "/var/result/data.txt"
def count_lines_in_file(filepath):
try:
with open(filepath, 'r') as f:
return sum(1 for _ in f)
except Exception:
return 0
def main():
if not os.path.exists(INPUT_DIR):
print(f"Input directory {INPUT_DIR} does not exist")
return
files = [f for f in os.listdir(INPUT_DIR) if os.path.isfile(os.path.join(INPUT_DIR, f))]
counts = []
for f in files:
full_path = os.path.join(INPUT_DIR, f)
line_count = count_lines_in_file(full_path)
counts.append(str(line_count))
os.makedirs(os.path.dirname(OUTPUT_FILE), exist_ok=True)
with open(OUTPUT_FILE, 'w') as out:
out.write("\n".join(counts))
print("worker-1: wrote line counts to", OUTPUT_FILE)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,7 @@
FROM python:3.11-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]

View File

@@ -0,0 +1,35 @@
import os
INPUT_FILE = "/var/data/data.txt"
OUTPUT_FILE = "/var/result/result.txt"
def main():
if not os.path.exists(INPUT_FILE):
print(f"Input file {INPUT_FILE} not found")
return
with open(INPUT_FILE, 'r') as f:
lines = f.read().strip().splitlines()
if not lines:
print("No numbers in input file")
return
try:
numbers = [int(line.strip()) for line in lines if line.strip()]
except ValueError:
print("Invalid number format in input file")
return
max_num = max(numbers)
result = max_num ** 2
os.makedirs(os.path.dirname(OUTPUT_FILE), exist_ok=True)
with open(OUTPUT_FILE, 'w') as out:
out.write(str(result))
print(f"worker-2: max number = {max_num}, squared = {result}")
print(result)
if __name__ == "__main__":
main()