Merge pull request 'agliullov_daniyar_lab_2 is ready' (#408) from agliullov_daniyar_lab_2 into main
Reviewed-on: #408
This commit is contained in:
commit
9ea823461a
18
agliullov_daniyar_lab_2/docker-compose.yml
Normal file
18
agliullov_daniyar_lab_2/docker-compose.yml
Normal file
@ -0,0 +1,18 @@
|
||||
# docker-compose.yml
|
||||
|
||||
services:
|
||||
service-1:
|
||||
build:
|
||||
context: ./service_1
|
||||
volumes:
|
||||
- ./data:/var/data
|
||||
- ./result:/var/result
|
||||
|
||||
service-2:
|
||||
build:
|
||||
context: ./service_2
|
||||
volumes:
|
||||
- ./data:/var/data
|
||||
- ./result:/var/result
|
||||
depends_on:
|
||||
- service-1
|
35
agliullov_daniyar_lab_2/readme.md
Normal file
35
agliullov_daniyar_lab_2/readme.md
Normal file
@ -0,0 +1,35 @@
|
||||
## Вариант 1 сервиса
|
||||
0. Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt.
|
||||
|
||||
## Вариант 2 сервиса
|
||||
0. Сохраняет произведение первого и последнего числа из файла /var/data/data.txt в /var/result/result.txt.
|
||||
|
||||
Для обоих приложений создадим Dockerfile. Вот пример для **service-1** файл для **service-2** будет идентичен, из-за одной версии питона и одного набора библеотек
|
||||
(используются только стандартная библиотека):
|
||||
|
||||
|
||||
|
||||
Пояснение:
|
||||
- **Stage 1**: Мы используем `python:3.10-slim` как образ для сборки, где копируем файл `main.py` и устанавливаем зависимости, если это необходимо.
|
||||
- **Stage 2**: В этом слое мы копируем скомпилированные файлы из предыдущего этапа и определяем команду для запуска приложения.
|
||||
|
||||
Аналогичный Dockerfile будет для **service_2**.
|
||||
|
||||
### Docker Compose файл
|
||||
|
||||
Теперь нужно настроить файл `docker-compose.yml`, который позволит запустить оба приложения:
|
||||
|
||||
|
||||
|
||||
Пояснение:
|
||||
- **services**: Мы объявляем два сервиса — `service_1` и `service_2`.
|
||||
- **build**: Указываем контекст сборки для каждого сервиса (директории, где находятся Dockerfile и код).
|
||||
- **volumes**: Монтируем локальные директории `./data` и `./result` в контейнеры, чтобы обмениваться файлами между сервисами.
|
||||
- **depends_on**: Задаем зависимость `service_2` от `service_1`, чтобы второй сервис запускался только после первого.
|
||||
|
||||
### Заключение
|
||||
|
||||
Это пример, как можно реализовать простейшее распределённое приложение с использованием Docker. Первое приложение генерирует данные для второго, который обрабатывает их и записывает результат в файл. Docker и Docker Compose позволяют легко управлять и изолировать каждое приложение.ker Compose для запуска двух программ, обрабатывающих данные в контейнерах.
|
||||
|
||||
|
||||
[Видео](https://disk.yandex.ru/d/FFqx6_tdtX8s-g)
|
11
agliullov_daniyar_lab_2/service_1/Dockerfile
Normal file
11
agliullov_daniyar_lab_2/service_1/Dockerfile
Normal file
@ -0,0 +1,11 @@
|
||||
FROM python:3.10-slim as builder
|
||||
|
||||
WORKDIR /app
|
||||
COPY ./main.py .
|
||||
|
||||
FROM python:3.10-slim
|
||||
|
||||
WORKDIR /app
|
||||
COPY --from=builder /app/main.py .
|
||||
|
||||
CMD ["python", "main.py"]
|
39
agliullov_daniyar_lab_2/service_1/main.py
Normal file
39
agliullov_daniyar_lab_2/service_1/main.py
Normal file
@ -0,0 +1,39 @@
|
||||
import os
|
||||
import shutil
|
||||
|
||||
def find_largest_file(directory):
|
||||
largest_file = None
|
||||
largest_size = 0
|
||||
|
||||
# Проходим по всем файлам и подкаталогам в указанном каталоге
|
||||
for dirpath, dirnames, filenames in os.walk(directory):
|
||||
for filename in filenames:
|
||||
filepath = os.path.join(dirpath, filename)
|
||||
try:
|
||||
# Получаем размер файла
|
||||
file_size = os.path.getsize(filepath)
|
||||
# Проверяем, является ли этот файл самым большим
|
||||
if file_size > largest_size:
|
||||
largest_size = file_size
|
||||
largest_file = filepath
|
||||
except OSError as e:
|
||||
print(f"Ошибка при доступе к файлу {filepath}: {e}")
|
||||
|
||||
return largest_file
|
||||
|
||||
def main():
|
||||
source_directory = '/var/data'
|
||||
destination_file = '/var/result/data.txt'
|
||||
|
||||
largest_file = find_largest_file(source_directory)
|
||||
|
||||
if largest_file:
|
||||
print(f"Самый большой файл: {largest_file} ({os.path.getsize(largest_file)} байт)")
|
||||
# Копируем самый большой файл в указанное место
|
||||
shutil.copy(largest_file, destination_file)
|
||||
print(f"Файл скопирован в: {destination_file}")
|
||||
else:
|
||||
print("Не найдено ни одного файла.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
11
agliullov_daniyar_lab_2/service_2/Dockerfile
Normal file
11
agliullov_daniyar_lab_2/service_2/Dockerfile
Normal file
@ -0,0 +1,11 @@
|
||||
FROM python:3.10-slim as builder
|
||||
|
||||
WORKDIR /app
|
||||
COPY ./main.py .
|
||||
|
||||
FROM python:3.10-slim
|
||||
|
||||
WORKDIR /app
|
||||
COPY --from=builder /app/main.py .
|
||||
|
||||
CMD ["python", "main.py"]
|
42
agliullov_daniyar_lab_2/service_2/main.py
Normal file
42
agliullov_daniyar_lab_2/service_2/main.py
Normal file
@ -0,0 +1,42 @@
|
||||
def read_numbers_from_file(file_path):
|
||||
try:
|
||||
with open(file_path, 'r') as file:
|
||||
# Читаем все строки и преобразуем их в числа
|
||||
numbers = [float(line.strip()) for line in file.read().split() if
|
||||
line.strip().isdigit() or (
|
||||
line.strip().replace('.', '', 1).isdigit() and line.strip().count('.') < 2)]
|
||||
return numbers
|
||||
except FileNotFoundError:
|
||||
print(f"Файл {file_path} не найден.")
|
||||
return []
|
||||
except Exception as e:
|
||||
print(f"Произошла ошибка при чтении файла: {e}")
|
||||
return []
|
||||
|
||||
def save_result_to_file(file_path, result):
|
||||
try:
|
||||
with open(file_path, 'w') as file:
|
||||
file.write(str(result))
|
||||
except Exception as e:
|
||||
print(f"Произошла ошибка при записи в файл: {e}")
|
||||
|
||||
def main():
|
||||
input_file = '/var/result/data.txt'
|
||||
output_file = '/var/result/result.txt'
|
||||
|
||||
numbers = read_numbers_from_file(input_file)
|
||||
|
||||
if numbers:
|
||||
first_number = numbers[0]
|
||||
last_number = numbers[-1]
|
||||
product = first_number * last_number
|
||||
|
||||
print(f"Первое число: {first_number}, Последнее число: {last_number}, Произведение: {product}")
|
||||
|
||||
save_result_to_file(output_file, product)
|
||||
print(f"Результат сохранён в {output_file}")
|
||||
else:
|
||||
print("Не удалось получить числа из файла.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user