Merge pull request 'romanova_adelina_lab_2' (#24) from romanova_adelina_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/DAS_2023_1/pulls/24
This commit is contained in:
commit
ee89271e08
BIN
romanova_adelina_lab_2/1.png
Normal file
BIN
romanova_adelina_lab_2/1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
BIN
romanova_adelina_lab_2/2.png
Normal file
BIN
romanova_adelina_lab_2/2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
179
romanova_adelina_lab_2/README.md
Normal file
179
romanova_adelina_lab_2/README.md
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
|
||||||
|
|
||||||
|
## Задание
|
||||||
|
|
||||||
|
* Разработать два приложения такие, что результат первого является исходными данными для второго.
|
||||||
|
* Собрать файл ```docker-compose.yml``` для запуска приложений.
|
||||||
|
|
||||||
|
Изучить файлы сборки образов ```docker``` и разработать их для созданных приложений и правильно закоммитить решение
|
||||||
|
|
||||||
|
### Варианты задания:
|
||||||
|
1. ```worker_1``` - ищет в каталоге ```/var/data``` самый большой по объёму файл и перекладывает его в ```/var/result/data.txt```
|
||||||
|
|
||||||
|
2. ```worker_2``` - Сохраняет произведение первого и последнего числа из файла ```/var/data/data.txt``` в ```/var/result/result.txt```
|
||||||
|
|
||||||
|
|
||||||
|
## Запуск
|
||||||
|
|
||||||
|
Введение в терминале команды:
|
||||||
|
```
|
||||||
|
docker compose up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Описание работы:
|
||||||
|
|
||||||
|
Для разработки приложений был выбран язык программирования - ```python```
|
||||||
|
|
||||||
|
### Разработка приложения worker_1
|
||||||
|
|
||||||
|
```worker_1``` - ищет в каталоге ```/var/data``` самый большой по объёму файл и перекладывает его в ```/var/result/data.txt```
|
||||||
|
|
||||||
|
Листинг кода:
|
||||||
|
```import os
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
def find_largest_file(directory):
|
||||||
|
files = os.listdir(directory)
|
||||||
|
if not files:
|
||||||
|
return None
|
||||||
|
|
||||||
|
largest_file = max(files, key=lambda f: os.path.getsize(os.path.join(directory, f)))
|
||||||
|
return largest_file
|
||||||
|
|
||||||
|
def main():
|
||||||
|
data_dir = '/var/data'
|
||||||
|
result_file = '/var/result/data.txt'
|
||||||
|
largest_file = find_largest_file(data_dir)
|
||||||
|
|
||||||
|
if largest_file:
|
||||||
|
shutil.copy2(os.path.join(data_dir, largest_file), result_file)
|
||||||
|
else:
|
||||||
|
print('No files to copy.')
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
Листинг кода сборки образа ```Dockerfile```
|
||||||
|
```
|
||||||
|
FROM python:3.11
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . .
|
||||||
|
CMD ["python", "worker_1.py"]
|
||||||
|
```
|
||||||
|
|
||||||
|
```WORKDIR /app:```
|
||||||
|
|
||||||
|
Эта строка устанавливает рабочую директорию внутри контейнера в /app. Все последующие инструкции Docker будут выполняться в этой директории.
|
||||||
|
|
||||||
|
```COPY ..```
|
||||||
|
|
||||||
|
Эта строка копирует содержимое текущего каталога (где находится Dockerfile) внутрь контейнера в рабочую директорию /app.
|
||||||
|
|
||||||
|
```CMD ["python", "worker_1.py"]:```
|
||||||
|
|
||||||
|
Эта строка задает команду, которая будет выполнена при запуске контейнера. В данном случае, она запускает скрипт worker_1.py с использованием интерпретатора Python.
|
||||||
|
|
||||||
|
### Разработка приложения worker_2
|
||||||
|
|
||||||
|
```worker_2``` - Сохраняет произведение первого и последнего числа из файла ```/var/data/data.txt``` в ```/var/result/result.txt`
|
||||||
|
|
||||||
|
Листинг кода:
|
||||||
|
```
|
||||||
|
def calculate_product_of_first_and_last_numbers(file_path):
|
||||||
|
try:
|
||||||
|
with open(file_path, 'r') as file:
|
||||||
|
numbers = [int(line.strip()) for line in file.readlines()]
|
||||||
|
|
||||||
|
if len(numbers) >= 2:
|
||||||
|
product = numbers[0] * numbers[-1]
|
||||||
|
print(f"Результат: {numbers[0]} * {numbers[-1]} = {product}")
|
||||||
|
return product
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def main():
|
||||||
|
input_file_path = "/var/data/data.txt"
|
||||||
|
output_file_path = "/var/result/result.txt"
|
||||||
|
|
||||||
|
result = calculate_product_of_first_and_last_numbers(input_file_path)
|
||||||
|
|
||||||
|
if result is not None:
|
||||||
|
with open(output_file_path, 'w') as output_file:
|
||||||
|
output_file.write(str(result))
|
||||||
|
else:
|
||||||
|
print("No result to save.")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
|
```
|
||||||
|
Листинг кода сборки образа ```Dockerfile```
|
||||||
|
```
|
||||||
|
FROM python:3.11
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . .
|
||||||
|
CMD ["python", "worker_2.py"]
|
||||||
|
```
|
||||||
|
|
||||||
|
Работа сборки образа происходит аналогично первой программе.
|
||||||
|
|
||||||
|
### Формирование файла docker-compose.yml
|
||||||
|
```
|
||||||
|
version: "3"
|
||||||
|
services:
|
||||||
|
worker_1:
|
||||||
|
build:
|
||||||
|
context: ./worker_1
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
volumes:
|
||||||
|
- ./data:/var/data
|
||||||
|
- ./result:/var/result
|
||||||
|
|
||||||
|
worker_2:
|
||||||
|
depends_on:
|
||||||
|
- worker_1
|
||||||
|
build:
|
||||||
|
context: ./worker_2
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
volumes:
|
||||||
|
- ./result:/var/data
|
||||||
|
- ./result:/var/result
|
||||||
|
```
|
||||||
|
|
||||||
|
```build``` указывает на метод сборки образа в котором: ```context``` указывает на корневую директорию приложения, а dockerfile указывает на путь к ```Dockerfile```, ```volumes``` устанавливает локальную папку ```data``` как папку входных файлов ```/var/data```, а локальную папку ```result``` - как папку выходных файлов ```/var/result```.
|
||||||
|
|
||||||
|
### Исходные данные папки data
|
||||||
|
Содержание файла data_1.txt:
|
||||||
|
```
|
||||||
|
123
|
||||||
|
456
|
||||||
|
789
|
||||||
|
```
|
||||||
|
Содержание файла data_2.txt:
|
||||||
|
```
|
||||||
|
234
|
||||||
|
125
|
||||||
|
764
|
||||||
|
789
|
||||||
|
```
|
||||||
|
Содержание файла data_2.txt:
|
||||||
|
```
|
||||||
|
8903
|
||||||
|
324
|
||||||
|
232
|
||||||
|
233
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# Скриншоты работы
|
||||||
|
Успешно выполненная работа:
|
||||||
|
![](1.png "")
|
||||||
|
|
||||||
|
Работа Docker Desktop:
|
||||||
|
![](2.png "")
|
||||||
|
|
||||||
|
# Youtube
|
||||||
|
https://youtu.be/WCKIk1zlH7o
|
3
romanova_adelina_lab_2/data/data_1.txt
Normal file
3
romanova_adelina_lab_2/data/data_1.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
123
|
||||||
|
456
|
||||||
|
789
|
4
romanova_adelina_lab_2/data/data_2.txt
Normal file
4
romanova_adelina_lab_2/data/data_2.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
234
|
||||||
|
125
|
||||||
|
764
|
||||||
|
789
|
4
romanova_adelina_lab_2/data/data_3.txt
Normal file
4
romanova_adelina_lab_2/data/data_3.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
8903
|
||||||
|
324
|
||||||
|
232
|
||||||
|
233
|
19
romanova_adelina_lab_2/docker-compose.yml
Normal file
19
romanova_adelina_lab_2/docker-compose.yml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
version: "3"
|
||||||
|
services:
|
||||||
|
worker_1:
|
||||||
|
build:
|
||||||
|
context: ./worker_1
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
volumes:
|
||||||
|
- ./data:/var/data
|
||||||
|
- ./result:/var/result
|
||||||
|
|
||||||
|
worker_2:
|
||||||
|
depends_on:
|
||||||
|
- worker_1
|
||||||
|
build:
|
||||||
|
context: ./worker_2
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
volumes:
|
||||||
|
- ./result:/var/data
|
||||||
|
- ./result:/var/result
|
4
romanova_adelina_lab_2/result/data.txt
Normal file
4
romanova_adelina_lab_2/result/data.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
8903
|
||||||
|
324
|
||||||
|
232
|
||||||
|
233
|
1
romanova_adelina_lab_2/result/result.txt
Normal file
1
romanova_adelina_lab_2/result/result.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
2074399
|
4
romanova_adelina_lab_2/worker_1/Dockerfile
Normal file
4
romanova_adelina_lab_2/worker_1/Dockerfile
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
FROM python:3.11
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . .
|
||||||
|
CMD ["python", "worker_1.py"]
|
23
romanova_adelina_lab_2/worker_1/worker_1.py
Normal file
23
romanova_adelina_lab_2/worker_1/worker_1.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
def find_largest_file(directory):
|
||||||
|
files = os.listdir(directory)
|
||||||
|
if not files:
|
||||||
|
return None
|
||||||
|
|
||||||
|
largest_file = max(files, key=lambda f: os.path.getsize(os.path.join(directory, f)))
|
||||||
|
return largest_file
|
||||||
|
|
||||||
|
def main():
|
||||||
|
data_dir = '/var/data'
|
||||||
|
result_file = '/var/result/data.txt'
|
||||||
|
largest_file = find_largest_file(data_dir)
|
||||||
|
|
||||||
|
if largest_file:
|
||||||
|
shutil.copy2(os.path.join(data_dir, largest_file), result_file)
|
||||||
|
else:
|
||||||
|
print('No files to copy.')
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
4
romanova_adelina_lab_2/worker_2/Dockerfile
Normal file
4
romanova_adelina_lab_2/worker_2/Dockerfile
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
FROM python:3.11
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . .
|
||||||
|
CMD ["python", "worker_2.py"]
|
32
romanova_adelina_lab_2/worker_2/worker_2.py
Normal file
32
romanova_adelina_lab_2/worker_2/worker_2.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_product_of_first_and_last_numbers(file_path):
|
||||||
|
try:
|
||||||
|
with open(file_path, 'r') as file:
|
||||||
|
numbers = [int(line.strip()) for line in file.readlines()]
|
||||||
|
|
||||||
|
if len(numbers) >= 2:
|
||||||
|
product = numbers[0] * numbers[-1]
|
||||||
|
print(f"Результат: {numbers[0]} * {numbers[-1]} = {product}")
|
||||||
|
return product
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def main():
|
||||||
|
input_file_path = "/var/data/data.txt"
|
||||||
|
output_file_path = "/var/result/result.txt"
|
||||||
|
|
||||||
|
result = calculate_product_of_first_and_last_numbers(input_file_path)
|
||||||
|
|
||||||
|
if result is not None:
|
||||||
|
with open(output_file_path, 'w') as output_file:
|
||||||
|
output_file.write(str(result))
|
||||||
|
else:
|
||||||
|
print("No result to save.")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue
Block a user