lab_created
This commit is contained in:
35
kozyrev_sergey_lab_2/README.md
Normal file
35
kozyrev_sergey_lab_2/README.md
Normal 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)
|
||||
|
||||
1
kozyrev_sergey_lab_2/data/file1.txt
Normal file
1
kozyrev_sergey_lab_2/data/file1.txt
Normal file
@@ -0,0 +1 @@
|
||||
qwerty
|
||||
3
kozyrev_sergey_lab_2/data/file2.txt
Normal file
3
kozyrev_sergey_lab_2/data/file2.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
asdfg
|
||||
zxcvb
|
||||
12345
|
||||
26
kozyrev_sergey_lab_2/docker-compose.yml
Normal file
26
kozyrev_sergey_lab_2/docker-compose.yml
Normal 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
|
||||
2
kozyrev_sergey_lab_2/result/data.txt
Normal file
2
kozyrev_sergey_lab_2/result/data.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
1
|
||||
3
|
||||
1
kozyrev_sergey_lab_2/result/result.txt
Normal file
1
kozyrev_sergey_lab_2/result/result.txt
Normal file
@@ -0,0 +1 @@
|
||||
9
|
||||
7
kozyrev_sergey_lab_2/worker-1/Dockerfile
Normal file
7
kozyrev_sergey_lab_2/worker-1/Dockerfile
Normal file
@@ -0,0 +1,7 @@
|
||||
FROM python:3.11-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY app.py .
|
||||
|
||||
CMD ["python", "app.py"]
|
||||
32
kozyrev_sergey_lab_2/worker-1/app.py
Normal file
32
kozyrev_sergey_lab_2/worker-1/app.py
Normal 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()
|
||||
7
kozyrev_sergey_lab_2/worker-2/Dockerfile
Normal file
7
kozyrev_sergey_lab_2/worker-2/Dockerfile
Normal file
@@ -0,0 +1,7 @@
|
||||
FROM python:3.11-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY app.py .
|
||||
|
||||
CMD ["python", "app.py"]
|
||||
35
kozyrev_sergey_lab_2/worker-2/app.py
Normal file
35
kozyrev_sergey_lab_2/worker-2/app.py
Normal 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()
|
||||
Reference in New Issue
Block a user