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:
Alexey 2023-12-05 22:22:47 +04:00
commit ee89271e08
13 changed files with 277 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View 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

View File

@ -0,0 +1,3 @@
123
456
789

View File

@ -0,0 +1,4 @@
234
125
764
789

View File

@ -0,0 +1,4 @@
8903
324
232
233

View 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

View File

@ -0,0 +1,4 @@
8903
324
232
233

View File

@ -0,0 +1 @@
2074399

View File

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

View 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()

View File

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

View 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()