Merge pull request 'fadeeva_nastya_lab_2 is ready' (#293) from fadeeva_nastya_lab_2 into main
Reviewed-on: #293
This commit is contained in:
commit
31346e7082
52
fadeeva_nastya_lab_2/README.md
Normal file
52
fadeeva_nastya_lab_2/README.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
|
||||||
|
|
||||||
|
## Задание
|
||||||
|
|
||||||
|
+ По выбранному варианту разработать два приложения такие, что результат первого является исходными данными для второго.
|
||||||
|
+ Изучить файлы сборки образов docker и разработать их для созданных приложений.
|
||||||
|
+ Собрать файл docker-compose.yml для запуска приложений.
|
||||||
|
+ Правильно закоммитить результат.
|
||||||
|
|
||||||
|
### Выбранные варианты задания
|
||||||
|
1. 1-ая программа. Берёт из каталога /var/data случайный файл и перекладывает его в /var/result/data.txt.
|
||||||
|
|
||||||
|
2. 2-ая программа. Сохраняет произведение первого и последнего числа из файла /var/result/data.txt в /var/result/result.txt.
|
||||||
|
|
||||||
|
### Дополнительная информация
|
||||||
|
|
||||||
|
+ Язык разработки приложений - pyton.
|
||||||
|
+ Содержимое исходных файлов - целые числа.
|
||||||
|
+ Каждая программа должна лежать в отдельной подпапке.
|
||||||
|
|
||||||
|
## Запуск работы программы
|
||||||
|
|
||||||
|
Для задания потребуется Docker - платформа для контейнеризации приложений.
|
||||||
|
|
||||||
|
В директории создаем файл docker-compose.yaml, чтобы потом можно было собрать и запустить программы всех сервисов:
|
||||||
|
|
||||||
|
```docker-compose up --build```
|
||||||
|
|
||||||
|
Эта команда сначала выполнит сборку, а затем запустит контейнеры.
|
||||||
|
|
||||||
|
После успешного запуска появится папка data со сгенерированными файлами и папка result, в которой два текстовых файла:
|
||||||
|
|
||||||
|
+ data.txt - файл, полученный после выполнения первой программы.
|
||||||
|
+ result.txt -файл, полученный после выполнения второй программы.
|
||||||
|
|
||||||
|
## Описание работы
|
||||||
|
|
||||||
|
В лабораторке использовали:
|
||||||
|
|
||||||
|
1. Генератор файлов в папке generator. Файл generate_files.py, генерирует случайные файлы с числами и сохраняет их в папке data.
|
||||||
|
|
||||||
|
2. Папка с первым приложением. Первое приложение worker.py, случайным образом получает один файл из папки data и копирует его содержимое в result/data.txt.
|
||||||
|
|
||||||
|
3. Папка со вторым приложением. Второе приложение worker.py находит произведение первого и последнего чисел из result/data.txt и записывает в result/result.txt.
|
||||||
|
|
||||||
|
4. Файл docker-compose.yml.
|
||||||
|
|
||||||
|
5. Файл Dockerfile. Прописываем базовый образ для Docker.
|
||||||
|
|
||||||
|
# Видеозапись работы программмы
|
||||||
|
|
||||||
|
https://vkvideo.ru/video186826232_456239553
|
45
fadeeva_nastya_lab_2/data/40ym8lste0tgq.txt
Normal file
45
fadeeva_nastya_lab_2/data/40ym8lste0tgq.txt
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
1000
|
||||||
|
351
|
||||||
|
352
|
||||||
|
836
|
||||||
|
805
|
||||||
|
140
|
||||||
|
108
|
||||||
|
778
|
||||||
|
482
|
||||||
|
196
|
||||||
|
671
|
||||||
|
8
|
||||||
|
58
|
||||||
|
572
|
||||||
|
409
|
||||||
|
269
|
||||||
|
390
|
||||||
|
198
|
||||||
|
62
|
||||||
|
545
|
||||||
|
913
|
||||||
|
109
|
||||||
|
639
|
||||||
|
52
|
||||||
|
947
|
||||||
|
56
|
||||||
|
316
|
||||||
|
578
|
||||||
|
938
|
||||||
|
626
|
||||||
|
952
|
||||||
|
39
|
||||||
|
363
|
||||||
|
680
|
||||||
|
203
|
||||||
|
874
|
||||||
|
308
|
||||||
|
443
|
||||||
|
712
|
||||||
|
781
|
||||||
|
114
|
||||||
|
605
|
||||||
|
74
|
||||||
|
198
|
||||||
|
822
|
49
fadeeva_nastya_lab_2/data/5zma1ri8ze5edkgj3vyn.txt
Normal file
49
fadeeva_nastya_lab_2/data/5zma1ri8ze5edkgj3vyn.txt
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
478
|
||||||
|
840
|
||||||
|
280
|
||||||
|
940
|
||||||
|
908
|
||||||
|
434
|
||||||
|
98
|
||||||
|
291
|
||||||
|
232
|
||||||
|
486
|
||||||
|
297
|
||||||
|
618
|
||||||
|
764
|
||||||
|
386
|
||||||
|
179
|
||||||
|
308
|
||||||
|
474
|
||||||
|
543
|
||||||
|
619
|
||||||
|
569
|
||||||
|
172
|
||||||
|
227
|
||||||
|
949
|
||||||
|
679
|
||||||
|
804
|
||||||
|
861
|
||||||
|
680
|
||||||
|
998
|
||||||
|
439
|
||||||
|
399
|
||||||
|
673
|
||||||
|
434
|
||||||
|
188
|
||||||
|
815
|
||||||
|
355
|
||||||
|
386
|
||||||
|
808
|
||||||
|
570
|
||||||
|
719
|
||||||
|
635
|
||||||
|
378
|
||||||
|
423
|
||||||
|
93
|
||||||
|
212
|
||||||
|
652
|
||||||
|
698
|
||||||
|
139
|
||||||
|
625
|
||||||
|
691
|
47
fadeeva_nastya_lab_2/data/necuiqczx5zzqt9.txt
Normal file
47
fadeeva_nastya_lab_2/data/necuiqczx5zzqt9.txt
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
392
|
||||||
|
303
|
||||||
|
278
|
||||||
|
602
|
||||||
|
798
|
||||||
|
208
|
||||||
|
513
|
||||||
|
828
|
||||||
|
713
|
||||||
|
986
|
||||||
|
428
|
||||||
|
675
|
||||||
|
511
|
||||||
|
950
|
||||||
|
646
|
||||||
|
618
|
||||||
|
533
|
||||||
|
432
|
||||||
|
975
|
||||||
|
234
|
||||||
|
891
|
||||||
|
304
|
||||||
|
22
|
||||||
|
634
|
||||||
|
787
|
||||||
|
201
|
||||||
|
216
|
||||||
|
363
|
||||||
|
447
|
||||||
|
402
|
||||||
|
23
|
||||||
|
357
|
||||||
|
171
|
||||||
|
682
|
||||||
|
845
|
||||||
|
50
|
||||||
|
680
|
||||||
|
647
|
||||||
|
953
|
||||||
|
944
|
||||||
|
594
|
||||||
|
657
|
||||||
|
305
|
||||||
|
28
|
||||||
|
78
|
||||||
|
788
|
||||||
|
741
|
1
fadeeva_nastya_lab_2/data/r321d6f7wyr.txt
Normal file
1
fadeeva_nastya_lab_2/data/r321d6f7wyr.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
96
|
40
fadeeva_nastya_lab_2/data/uzdhljsafp03p5nlruv.txt
Normal file
40
fadeeva_nastya_lab_2/data/uzdhljsafp03p5nlruv.txt
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
884
|
||||||
|
985
|
||||||
|
757
|
||||||
|
289
|
||||||
|
855
|
||||||
|
941
|
||||||
|
500
|
||||||
|
427
|
||||||
|
958
|
||||||
|
508
|
||||||
|
206
|
||||||
|
710
|
||||||
|
721
|
||||||
|
38
|
||||||
|
471
|
||||||
|
855
|
||||||
|
805
|
||||||
|
785
|
||||||
|
333
|
||||||
|
828
|
||||||
|
135
|
||||||
|
211
|
||||||
|
745
|
||||||
|
427
|
||||||
|
886
|
||||||
|
355
|
||||||
|
611
|
||||||
|
69
|
||||||
|
521
|
||||||
|
168
|
||||||
|
132
|
||||||
|
964
|
||||||
|
444
|
||||||
|
785
|
||||||
|
303
|
||||||
|
771
|
||||||
|
832
|
||||||
|
556
|
||||||
|
47
|
||||||
|
946
|
34
fadeeva_nastya_lab_2/data/voe9xhfk6mjc2kx4gl.txt
Normal file
34
fadeeva_nastya_lab_2/data/voe9xhfk6mjc2kx4gl.txt
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
79
|
||||||
|
45
|
||||||
|
347
|
||||||
|
611
|
||||||
|
960
|
||||||
|
291
|
||||||
|
379
|
||||||
|
154
|
||||||
|
531
|
||||||
|
700
|
||||||
|
770
|
||||||
|
399
|
||||||
|
611
|
||||||
|
442
|
||||||
|
458
|
||||||
|
75
|
||||||
|
968
|
||||||
|
474
|
||||||
|
491
|
||||||
|
860
|
||||||
|
635
|
||||||
|
414
|
||||||
|
822
|
||||||
|
800
|
||||||
|
134
|
||||||
|
535
|
||||||
|
961
|
||||||
|
382
|
||||||
|
273
|
||||||
|
173
|
||||||
|
833
|
||||||
|
425
|
||||||
|
286
|
||||||
|
735
|
45
fadeeva_nastya_lab_2/data/y8bpuozgmsxjf.txt
Normal file
45
fadeeva_nastya_lab_2/data/y8bpuozgmsxjf.txt
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
789
|
||||||
|
914
|
||||||
|
706
|
||||||
|
57
|
||||||
|
225
|
||||||
|
252
|
||||||
|
166
|
||||||
|
253
|
||||||
|
455
|
||||||
|
589
|
||||||
|
809
|
||||||
|
366
|
||||||
|
268
|
||||||
|
625
|
||||||
|
910
|
||||||
|
828
|
||||||
|
371
|
||||||
|
972
|
||||||
|
269
|
||||||
|
801
|
||||||
|
677
|
||||||
|
517
|
||||||
|
209
|
||||||
|
461
|
||||||
|
281
|
||||||
|
104
|
||||||
|
636
|
||||||
|
515
|
||||||
|
1
|
||||||
|
41
|
||||||
|
362
|
||||||
|
416
|
||||||
|
313
|
||||||
|
883
|
||||||
|
809
|
||||||
|
287
|
||||||
|
49
|
||||||
|
874
|
||||||
|
29
|
||||||
|
383
|
||||||
|
491
|
||||||
|
242
|
||||||
|
258
|
||||||
|
489
|
||||||
|
780
|
27
fadeeva_nastya_lab_2/docker-compose.yml
Normal file
27
fadeeva_nastya_lab_2/docker-compose.yml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
services:
|
||||||
|
# сервис, отвечающий за генерацию файлов
|
||||||
|
generator:
|
||||||
|
build:
|
||||||
|
context: ./generator # путь к директори с Dokcerfile для генерации
|
||||||
|
volumes:
|
||||||
|
- ./data:/var/data # монтирование локальной директории ./data в директорию /var/data внутри контейнера
|
||||||
|
entrypoint: python generate_files.py # запуск скрипта генерации
|
||||||
|
|
||||||
|
# Первый сервис, получающий случайный файл
|
||||||
|
worker_1:
|
||||||
|
build:
|
||||||
|
context: ./worker_1 # путь к директори с Dokcerfile для первого сервиса
|
||||||
|
volumes:
|
||||||
|
- ./data:/var/data # Монтирование локальной директории data в /var/data
|
||||||
|
- ./result:/var/result # Монтирование локальной директории data в /var/result
|
||||||
|
depends_on: # Указывает, что первый сервис зависит от генератора
|
||||||
|
- generator
|
||||||
|
|
||||||
|
# Второй сервис, считающий произведение первого и последнего чисел из файла
|
||||||
|
worker_2:
|
||||||
|
build:
|
||||||
|
context: ./worker_2 # путь к директори с Dokcerfile для второго сервиса
|
||||||
|
volumes:
|
||||||
|
- ./result:/var/result # Монтирование локальной директории data в /var/result
|
||||||
|
depends_on: # Указывает, что второй сервис зависит от первого
|
||||||
|
- worker_1
|
13
fadeeva_nastya_lab_2/generator/Dockerfile
Normal file
13
fadeeva_nastya_lab_2/generator/Dockerfile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Указываем базовый образ для Docker
|
||||||
|
#slim означает, что это более компактный, содержащий только основные компоненты Python, что уменьшает размер образа
|
||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
# Устанавливаем рабочую директорию внутри контейнера Docker в /worker.
|
||||||
|
# Все последующие команды в Dockerfile будут выполняться в этой директории.
|
||||||
|
WORKDIR /worker
|
||||||
|
|
||||||
|
# Перемещаем файл в контейнер
|
||||||
|
COPY generate_files.py /worker/
|
||||||
|
|
||||||
|
# Указываем команду, которая будет выполняться при запуске контейнера
|
||||||
|
CMD ["python", "generate_files.py"]
|
31
fadeeva_nastya_lab_2/generator/generate_files.py
Normal file
31
fadeeva_nastya_lab_2/generator/generate_files.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import os
|
||||||
|
import random
|
||||||
|
import string
|
||||||
|
|
||||||
|
def generate_random_filename(length):
|
||||||
|
return ''.join(random.choices(string.ascii_lowercase + string.digits, k=length)) + '.txt'
|
||||||
|
|
||||||
|
def generate_data_files(directory, num_files, min_lines, max_lines):
|
||||||
|
# Создание директории, если таковой не существует
|
||||||
|
if not os.path.exists(directory):
|
||||||
|
os.makedirs(directory)
|
||||||
|
|
||||||
|
# Проверка, пустая ли директория
|
||||||
|
if os.listdir(directory):
|
||||||
|
print(f"{directory} is not empty, skipping file generation.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Генерация файлов
|
||||||
|
for _ in range(num_files):
|
||||||
|
file_name = generate_random_filename(random.randint(1, 20))
|
||||||
|
file_path = os.path.join(directory, file_name)
|
||||||
|
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
num_lines = random.randint(min_lines, max_lines)
|
||||||
|
for _ in range(num_lines):
|
||||||
|
f.write(f"{random.randint(1, 1000)}\n")
|
||||||
|
|
||||||
|
print(f"Generated file: {file_path}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
generate_data_files('/var/data', num_files=random.randint(5, 15), min_lines=1, max_lines=50)
|
34
fadeeva_nastya_lab_2/result/data.txt
Normal file
34
fadeeva_nastya_lab_2/result/data.txt
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
79
|
||||||
|
45
|
||||||
|
347
|
||||||
|
611
|
||||||
|
960
|
||||||
|
291
|
||||||
|
379
|
||||||
|
154
|
||||||
|
531
|
||||||
|
700
|
||||||
|
770
|
||||||
|
399
|
||||||
|
611
|
||||||
|
442
|
||||||
|
458
|
||||||
|
75
|
||||||
|
968
|
||||||
|
474
|
||||||
|
491
|
||||||
|
860
|
||||||
|
635
|
||||||
|
414
|
||||||
|
822
|
||||||
|
800
|
||||||
|
134
|
||||||
|
535
|
||||||
|
961
|
||||||
|
382
|
||||||
|
273
|
||||||
|
173
|
||||||
|
833
|
||||||
|
425
|
||||||
|
286
|
||||||
|
735
|
1
fadeeva_nastya_lab_2/result/result.txt
Normal file
1
fadeeva_nastya_lab_2/result/result.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
58065
|
13
fadeeva_nastya_lab_2/worker_1/Dockerfile
Normal file
13
fadeeva_nastya_lab_2/worker_1/Dockerfile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Указываем базовый образ для Docker
|
||||||
|
#slim означает, что это более компактный, содержащий только основные компоненты Python, что уменьшает размер образа
|
||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
# Устанавливаем рабочую директорию внутри контейнера Docker в /worker.
|
||||||
|
# Все последующие команды в Dockerfile будут выполняться в этой директории.
|
||||||
|
WORKDIR /worker
|
||||||
|
|
||||||
|
# Перемещаем файл в контейнер
|
||||||
|
COPY worker.py /worker/
|
||||||
|
|
||||||
|
# Указываем команду, которая будет выполняться при запуске контейнера
|
||||||
|
CMD ["python", "worker.py"]
|
28
fadeeva_nastya_lab_2/worker_1/worker.py
Normal file
28
fadeeva_nastya_lab_2/worker_1/worker.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import os
|
||||||
|
import random
|
||||||
|
|
||||||
|
def find_shortest_filename(source_dir, result_file):
|
||||||
|
# Проверяем есть ли папка result, если нет - создаем
|
||||||
|
result_dir = os.path.dirname(result_file)
|
||||||
|
if not os.path.exists(result_dir):
|
||||||
|
os.makedirs(result_dir)
|
||||||
|
print(f"Created directory {result_dir}")
|
||||||
|
|
||||||
|
files = [f for f in os.listdir(source_dir) if os.path.isfile(os.path.join(source_dir, f))]
|
||||||
|
|
||||||
|
if not files:
|
||||||
|
print(f"No files found in {source_dir}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Выбор случайного файла
|
||||||
|
random_file = random.choice(files)
|
||||||
|
random_file_path = os.path.join(source_dir, random_file)
|
||||||
|
|
||||||
|
# Копируем файл в result/data.txt., если файл уже есть перезаписываем
|
||||||
|
with open(random_file_path, 'r') as f_in, open(result_file, 'w') as f_out:
|
||||||
|
f_out.write(f_in.read())
|
||||||
|
|
||||||
|
print(f"Moved {random_file} to {result_file}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
find_shortest_filename('/var/data', '/var/result/data.txt')
|
13
fadeeva_nastya_lab_2/worker_2/Dockerfile
Normal file
13
fadeeva_nastya_lab_2/worker_2/Dockerfile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Указываем базовый образ для Docker
|
||||||
|
#slim означает, что это более компактный, содержащий только основные компоненты Python, что уменьшает размер образа
|
||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
# Устанавливаем рабочую директорию внутри контейнера Docker в /worker.
|
||||||
|
# Все последующие команды в Dockerfile будут выполняться в этой директории.
|
||||||
|
WORKDIR /worker
|
||||||
|
|
||||||
|
# Перемещаем файл в контейнер
|
||||||
|
COPY worker.py /worker/
|
||||||
|
|
||||||
|
# Указываем команду, которая будет выполняться при запуске контейнера
|
||||||
|
CMD ["python", "worker.py"]
|
27
fadeeva_nastya_lab_2/worker_2/worker.py
Normal file
27
fadeeva_nastya_lab_2/worker_2/worker.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
def find_smallest_number_and_cube(input_file, output_file):
|
||||||
|
# Проверяем, существует файл data.txt
|
||||||
|
if not os.path.exists(input_file):
|
||||||
|
print(f"File {input_file} does not exist.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Считываем содержимое файла
|
||||||
|
with open(input_file, 'r') as f:
|
||||||
|
numbers = [int(line.strip()) for line in f.readlines()]
|
||||||
|
|
||||||
|
if numbers:
|
||||||
|
first_number = numbers[0]
|
||||||
|
last_number = numbers.pop()
|
||||||
|
result = first_number * last_number
|
||||||
|
|
||||||
|
# Записываем полученный результата в result.txt
|
||||||
|
with open(output_file, 'w') as f_out:
|
||||||
|
f_out.write(str(result))
|
||||||
|
|
||||||
|
print(f"Saved {first_number}х{last_number} to {output_file}")
|
||||||
|
else:
|
||||||
|
print(f"No numbers found in {input_file}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
find_smallest_number_and_cube('/var/result/data.txt', '/var/result/result.txt')
|
Loading…
Reference in New Issue
Block a user