DAS_2023_1/romanova_adelina_lab_2/README.md

180 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лабораторная работа №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