Merge pull request 'vaksman_valeria_lab_2' (#39) from vaksman_valeria_lab_2 into main

Reviewed-on: Alexey/DAS_2024_1#39
This commit is contained in:
Alexey 2024-10-07 23:09:07 +04:00
commit ac3dc2e566
22 changed files with 957 additions and 0 deletions

View File

@ -0,0 +1,4 @@
DB_HOST = db
DB_USER = wordpress
DB_PASSWORD = wordpress
DB_NAME = wordpress

View File

@ -0,0 +1,3 @@
result/
data/
.vscode/

View File

@ -0,0 +1,43 @@
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
## Задание
* Разработать два приложения такие, что результат первого является исходными данными для второго.
* Собрать файл ```docker-compose.yml``` для запуска приложений.
Изучить файлы сборки образов ```docker``` и разработать их для созданных приложений и правильно закоммитить решение
### Варианты задания:
 1. ```app_one``` - Ищет в каталоге ```/var/data``` файл с наибольшим количеством строк и перекладывает его в ```/var/result/data.txt.```
 2. ```app_two``` - Ищет наименьшее число из файла ```/var/data/data.txt``` и сохраняет его третью степень в ```/var/result/result.txt.```
## Запуск
## Запуск работы
1. Убедиться, что установлены необходимые технологии:
- Docker: Платформа для контейнеризации приложений.
- Docker Compose: Инструмент для запуска многоконтейнерных приложений на основе `docker-compose.yaml`. Обычно поставляется вместе с Docker. Чтобы проверить, установлена ли утилита, нужно запустить команду:
```bash
docker-compose --version
```
2. В директории, где находится файл `docker-compose.yaml`, выполнить следующую команду для запуска всех сервисов:
```bash
docker-compose up --build
```
Эта команда сначала выполнит сборку, а затем запустит контейнеры.
3. После успешного запуска можно перейти в каталог проекта и увидеть папку data со сгенерированными файлами и папку result, в которой два текстовых файла:
- data.txt - файл, полученный после выполнения первой программы.
- result.txt -файл, полученный после выполнения второй программы.
## Описание работы:
Для разработки приложений был выбран язык программирования - ```python```
Построчное описание docker-compose.yaml и других файлов выполнено в самих файлах.
# Вк видео
https://vk.com/video256017065_456239871?list=ln-0dkZ8lxZS2VXpSR3TP

View File

@ -0,0 +1,11 @@
# Официальный образ Python 3.10
FROM python:3.10-slim
# Установка рабочей директории
WORKDIR /app
# Копирование всех (в данном случае одного) файлов в контейнер
COPY First.py /app/
# Запуск программы
CMD ["python", "First.py"]

View File

@ -0,0 +1,31 @@
import os
import shutil
# Пути к директориии для поиска и файла для сохранения
source_dir = '/var/data'
destination_file = '/var/result/data.txt'
# Простая функция дл подсчёта строк в файле. Настроили для работы с кириллицей (utf-8)
def count_lines(filepath):
with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
return sum(1 for _ in f)
# Старт поиска файла по условию (самое большое кол-во строк)
max_lines = 0
max_file = None
for filename in os.listdir(source_dir):
file_path = os.path.join(source_dir, filename)
if os.path.isfile(file_path):
lines = count_lines(file_path)
if lines > max_lines:
max_lines = lines
max_file = file_path
# Копирование файла с самым большим кол-вом строчек в нужную директорию
if max_file:
shutil.copy(max_file, destination_file)
print(f"{max_file} с кол-вом строк {max_lines} был перемещен в {destination_file}")
else:
print("Указанная директория пустая :(")

View File

@ -0,0 +1,11 @@
# Официальный образ Python 3.10
FROM python:3.10-slim
# Установка рабочей директории
WORKDIR /app
# Копирование всех (в данном случае одного) файлов в контейнер
COPY Second.py /app/
# Запуск программы
CMD ["python", "Second.py"]

View File

@ -0,0 +1,18 @@
# Пути к директориии c файлами для поиска и сохранения
input_file = '/var/result/data.txt'
output_file = '/var/result/result.txt'
# Поиск наименьшего числа в файле
with open(input_file, 'r') as f:
numbers = [float(line.strip()) for line in f if line.strip()]
# Искомое min число
min_number = min(numbers)
cubed_number = min_number ** 3
# Сохранение
with open(output_file, 'w') as f:
f.write(str(cubed_number))
print(f"Наименьшее число: {min_number}\nЕго третья степень: {cubed_number}\nРезультат сохранён в {output_file}")

View File

@ -0,0 +1,8 @@
278
940
336
99
360
451
836
359

View File

@ -0,0 +1,72 @@
240
468
64
586
648
230
203
295
979
621
528
718
107
822
323
691
446
667
994
645
985
604
664
465
541
747
163
329
993
374
968
512
739
774
928
433
560
610
336
194
572
735
775
617
712
412
324
40
837
15
100
28
682
498
628
832
889
964
941
167
777
400
413
361
326
796
68
154
355
866
161
76

View File

@ -0,0 +1,75 @@
116
224
318
215
419
465
431
319
838
430
366
906
166
69
576
173
879
177
43
586
34
990
794
474
961
980
771
170
262
294
294
718
802
745
464
411
626
702
809
917
580
368
101
674
564
335
581
437
907
546
545
545
237
205
263
503
759
199
915
835
765
784
562
834
921
784
242
547
988
477
823
640
440
475
151

View File

@ -0,0 +1,97 @@
157
634
716
273
113
861
144
182
379
619
766
375
857
836
380
752
328
460
560
369
900
258
78
847
275
802
903
892
211
294
68
590
193
913
164
855
583
983
696
330
327
798
442
669
211
677
225
633
784
961
246
683
184
247
315
9
876
260
743
200
813
578
465
429
738
783
695
206
658
701
612
689
66
971
334
371
638
549
720
497
569
945
701
415
200
422
977
931
854
638
583
870
938
53
349
572
414

View File

@ -0,0 +1,83 @@
830
7
232
405
514
173
739
974
156
469
232
226
988
957
272
491
721
703
751
797
379
866
119
697
846
634
840
483
660
258
48
399
807
344
370
373
304
520
464
80
258
57
172
343
693
342
893
702
794
313
767
466
966
433
842
845
836
676
560
398
442
531
548
896
488
573
662
427
840
962
460
108
146
862
651
559
755
536
14
702
709
379
231

View File

@ -0,0 +1,95 @@
278
58
817
997
915
183
750
625
302
228
819
357
797
672
990
207
477
872
40
792
45
405
669
375
137
807
876
84
726
813
629
301
331
143
598
429
827
173
850
548
19
907
185
392
257
349
480
314
510
239
420
994
880
492
366
540
96
283
331
604
38
93
844
197
780
159
338
932
661
936
573
602
319
512
472
419
374
144
872
76
634
535
365
247
169
5
934
483
252
807
533
387
323
791
701

View File

@ -0,0 +1,37 @@
149
821
575
117
846
682
74
706
415
736
910
392
31
210
425
565
645
396
774
16
882
260
668
997
94
286
170
506
494
634
635
319
943
885
555
662
727

View File

@ -0,0 +1,72 @@
91
433
212
692
903
322
360
926
952
428
142
775
939
979
241
298
697
951
688
613
801
653
543
815
356
170
25
620
57
102
483
317
982
531
15
286
948
494
102
537
871
741
412
135
543
228
158
9
852
432
598
997
367
139
783
475
73
761
466
520
605
444
353
473
8
925
977
634
769
905
115
213

View File

@ -0,0 +1,65 @@
764
559
169
642
513
341
376
904
912
313
522
226
467
172
952
315
359
612
695
487
564
697
681
31
186
222
212
631
177
46
443
252
262
662
480
750
560
148
342
119
659
82
846
84
726
182
286
648
252
826
848
351
98
619
630
503
507
527
662
961
403
752
756
938
16

View File

@ -0,0 +1,65 @@
498
783
418
943
427
460
545
38
892
345
552
605
591
958
903
927
38
950
774
596
314
177
499
706
440
943
451
13
306
126
831
311
834
304
186
265
456
21
320
746
570
708
172
702
320
532
491
334
757
505
83
167
312
511
723
92
885
904
608
542
579
679
615
993
60

View File

@ -0,0 +1,27 @@
services:
# Сервис файлового генератора
generator:
build:
context: ./file_generator # Путь к директории с Dockerfile
volumes:
- ./data:/var/data # Монтирование локальной папки data в /var/data, то есть в контейнере
# Сервис первой программы
app_one:
depends_on: # повесили ожидание запуска генератора файлов
- generator
build:
context: ./app_one/ # Путь к директории с Dockerfile
volumes:
- ./data:/var/data
- ./result:/var/result
# Сервис второй программы
app_two:
depends_on: # повесили ожидание запуска первой программы
- app_one
build:
context: ./app_two/ # Путь к директории с Dockerfile
volumes:
- ./data:/var/data
- ./result:/var/result

View File

@ -0,0 +1,11 @@
# Официальный образ Python 3.10
FROM python:3.10-slim
# Установка рабочей директории
WORKDIR /app
# Копирование всех (в данном случае одного) файлов в контейнер
COPY Generator.py /app/
# Запуск программы
CMD ["python", "Generator.py"]

View File

@ -0,0 +1,31 @@
import os
import random
# Директория для генерации файлов
output_dir = '/var/data'
# Проверка на наличие таковой
os.makedirs(output_dir, exist_ok=True)
# Генерируем случайное кол-во файлов (1-15)
num_files = random.randint(1, 15)
# Случайное по всем статьям заполнение файла
def generate_random_file(filename):
# Рандомное кол-во строк в файле
num_lines = random.randint(1, 100)
with open(filename, 'w') as f:
for _ in range(num_lines):
# Для полного швепса выбираем случайное число
random_number = random.randint(0, 1000)
f.write(f"{random_number}\n")
# Запускаем генерацию нашего набора файлов
for i in range(num_files):
filename = os.path.join(output_dir, f'random_file_{i + 1}.txt')
generate_random_file(filename)
print(f"Генерация файла {filename}.")
print(f"Общее кол-во сгенерированных файлов: {num_files}")

View File

@ -0,0 +1,97 @@
157
634
716
273
113
861
144
182
379
619
766
375
857
836
380
752
328
460
560
369
900
258
78
847
275
802
903
892
211
294
68
590
193
913
164
855
583
983
696
330
327
798
442
669
211
677
225
633
784
961
246
683
184
247
315
9
876
260
743
200
813
578
465
429
738
783
695
206
658
701
612
689
66
971
334
371
638
549
720
497
569
945
701
415
200
422
977
931
854
638
583
870
938
53
349
572
414

View File

@ -0,0 +1 @@
729.0