diff --git a/kalyshev_yan_lab_2/.gitignore b/kalyshev_yan_lab_2/.gitignore new file mode 100644 index 0000000..e1c443e --- /dev/null +++ b/kalyshev_yan_lab_2/.gitignore @@ -0,0 +1,5 @@ +data/ +result/ +result_first/ +result_second/ +datagen.py diff --git a/kalyshev_yan_lab_2/FirstProgram/Dockerfile b/kalyshev_yan_lab_2/FirstProgram/Dockerfile new file mode 100644 index 0000000..79fedcb --- /dev/null +++ b/kalyshev_yan_lab_2/FirstProgram/Dockerfile @@ -0,0 +1,16 @@ +#Берем базовый образ python +FROM python:3.12 + +#Устанавливаем рабочую директорию +WORKDIR /app + +#Копирум код в рабочую директорию +COPY main.py . + +#Задаем /var/data как монтируемый +VOLUME ["/var/data"] +#Задаем /var/result как монтируемый +VOLUME ["/var/result"] + +#Задаем команду для выполнения программы +CMD ["python", "main.py"] diff --git a/kalyshev_yan_lab_2/FirstProgram/main.py b/kalyshev_yan_lab_2/FirstProgram/main.py new file mode 100644 index 0000000..8f9edf1 --- /dev/null +++ b/kalyshev_yan_lab_2/FirstProgram/main.py @@ -0,0 +1,79 @@ +import os +import random + +# Установите полный путь к каталогу, в котором нужно искать самый большой файл. +CATALOG_PATH = "/var/data" + +# Полный путь до файла результата. +RESULT_FILE = "/var/result/data.txt" + + +def find_largest_file(directory): + """Ищет самый большой по объему файл в заданном каталоге и его подкаталогах.""" + + largest_file = None + max_size = 0 + + for root, _, files in os.walk(directory): + for file in files: + # Полный путь к текущему файлу. + filepath = os.path.join(root, file) + + try: + file_size = os.stat(filepath).st_size + + if file_size > max_size: + max_size = file_size + largest_file = (filepath, file_size) + + except OSError as e: + print(f"Ошибка при открытии файла '{filepath}': {e}") + + return largest_file + + +def copy_file(src, dst): + """Копирует содержимое файла src в файл dst.""" + + try: + with open(dst, "wb") as f_dst, open(src, "rb") as f_src: + while chunk := f_src.read(4096): + f_dst.write(chunk) + + print(f"Файл '{src}' успешно скопирован в '{dst}'.") + + except Exception as e: + print(f"Ошибка при копировании файла '{src}': {e}") + + +def main(): + largest_file_path = find_largest_file(CATALOG_PATH) + + if largest_file_path: + src_path, _ = largest_file_path + dst_path = RESULT_FILE + + copy_file(src_path, dst_path) + + else: + print("Нет файлов в каталоге.") + + +def generate_random_numbers(filename, count): + """Функция генерирует случайные числа и записывает их в файл.""" + + with open(filename, "w") as f: + for _ in range(count): + num = random.randint(0, 1000) + f.write(str(num) + "\n") + + print(f"Случайные числа успешно записаны в '{filename}'.") + + +if __name__ == "__main__": + generate_random_numbers("/var/data/data1.txt", 50) + generate_random_numbers("/var/data/data2.txt", 75) + generate_random_numbers("/var/data/data3.txt", 25) + print("Генерация файлов завершена.") + + main() diff --git a/kalyshev_yan_lab_2/README.md b/kalyshev_yan_lab_2/README.md new file mode 100644 index 0000000..8114ef3 --- /dev/null +++ b/kalyshev_yan_lab_2/README.md @@ -0,0 +1,74 @@ +# Калышев Ян ПИбд-42 + +## Описание + +Этот проект предоставляет 2 контейнера с простыми python-скриптами такими, что результат первого является исходными данными для второго. + +## 1. Варианты + +Для первой программы был взят вариант: +**0**. Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt. + +Для второй программы был взят вариант: +**2**. Ищет наименьшее число из файла /var/data/data.txt и сохраняет его третью степень в /var/result/result.txt. + +## 2. Структура Dockerfile + +Оба Dockerfile почти одинаковые: + +```Dockerfile +#Берем базовый образ python +FROM python:3.12 + +#Устанавливаем рабочую директорию +WORKDIR /app + +#Копирум код в рабочую директорию +COPY main.py . + +#Задаем /var/data как монтируемый +VOLUME ["/var/data"] +#Задаем /var/result как монтируемый +VOLUME ["/var/result"] + +#Задаем команду для выполнения программы +CMD ["python", "main.py"] +``` + +## 3. Docker Compose + +`docker-compose.yml`: + +```yaml +services: + #Первый скрипт + first: + #Указание директории для сборки первого скрипта + build: ./FirstProgram/ + #Монтирование 2 каталогов из хост системы + volumes: + - ./data:/var/data + - ./result_first:/var/result + + #Второй скрипт + second: + #Указание директории для сборки второго скрипта + build: ./SecondProgram/ + #Задание очередности запуска с помощью depends_on + depends_on: + - first + #Монтирование 2 каталогов из хост системы + volumes: + - ./result_first:/var/data + - ./result_second:/var/result +``` + +## 4. Запуск + +Для запуска использовать команду `docker compose up --build` +Предварительно нужно создать папку `data`, в которой создать файлы, где каждая строка - это число. +Результат первого скрипта будет в папке `result_first`, результат второго скрипта будет в папке `result_second`. + +## 7. Ссылка на видео + +[Видео-отчёт Калышев Ян ПИбд-42](https://zyzf.space/s/65HRyTTXAzxpwBF) diff --git a/kalyshev_yan_lab_2/SecondProgram/Dockerfile b/kalyshev_yan_lab_2/SecondProgram/Dockerfile new file mode 100644 index 0000000..79fedcb --- /dev/null +++ b/kalyshev_yan_lab_2/SecondProgram/Dockerfile @@ -0,0 +1,16 @@ +#Берем базовый образ python +FROM python:3.12 + +#Устанавливаем рабочую директорию +WORKDIR /app + +#Копирум код в рабочую директорию +COPY main.py . + +#Задаем /var/data как монтируемый +VOLUME ["/var/data"] +#Задаем /var/result как монтируемый +VOLUME ["/var/result"] + +#Задаем команду для выполнения программы +CMD ["python", "main.py"] diff --git a/kalyshev_yan_lab_2/SecondProgram/main.py b/kalyshev_yan_lab_2/SecondProgram/main.py new file mode 100644 index 0000000..607ae04 --- /dev/null +++ b/kalyshev_yan_lab_2/SecondProgram/main.py @@ -0,0 +1,60 @@ +# Установите полный путь к файлу, из которого нужно читать числа. +DATA_FILE = "/var/data/data.txt" + +# Полный путь до файла результата. +RESULT_FILE = "/var/result/result.txt" + + +def find_smallest_number(data_file): + """Ищет наименьшее число в заданном файле.""" + + try: + with open(data_file, "r") as f: + numbers = [int(line.strip()) for line in f.readlines()] + + smallest_num = min(numbers) + return smallest_num + + except ValueError as e: + print(f"Ошибка при преобразовании строк в числа: {e}") + + except Exception as e: + print(f"Ошибка чтения файла '{data_file}': {e}") + + return None + + +def cube_number(num): + """Возвращает куб заданного числа.""" + + return num**3 + + +def write_result(result_file, result): + """Записывает результат в файл.""" + + try: + with open(result_file, "w") as f: + f.write(str(result)) + + print(f"Результат '{result}' успешно записан в '{result_file}'.") + + except Exception as e: + print(f"Ошибка записи результата в файл '{result_file}': {e}") + + +def main(): + smallest_num = find_smallest_number(DATA_FILE) + + if smallest_num is not None: + result = cube_number(smallest_num) + + write_result(RESULT_FILE, result) + print(result) + + else: + print("Нет чисел в файле.") + + +if __name__ == "__main__": + main() diff --git a/kalyshev_yan_lab_2/docker-compose.yml b/kalyshev_yan_lab_2/docker-compose.yml new file mode 100644 index 0000000..76eb9f7 --- /dev/null +++ b/kalyshev_yan_lab_2/docker-compose.yml @@ -0,0 +1,21 @@ +services: + #Первый скрипт + first: + #Указание директории для сборки первого скрипта + build: ./FirstProgram/ + #Монтирование 2 каталогов из хост системы + volumes: + - ./data:/var/data + - ./result_first:/var/result + + #Второй скрипт + second: + #Указание директории для сборки второго скрипта + build: ./SecondProgram/ + #Задание очередности запуска с помощью depends_on + depends_on: + - first + #Монтирование 2 каталогов из хост системы + volumes: + - ./result_first:/var/data + - ./result_second:/var/result