agliullov_daniyar_lab_2 is ready

This commit is contained in:
Darya 2024-12-30 22:42:02 +04:00
parent 5dd9e26f07
commit 54f8d19f2d
6 changed files with 156 additions and 0 deletions

View 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

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

View 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"]

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

View 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"]

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