diff --git a/mashkova_margarita_lab_2/README.md b/mashkova_margarita_lab_2/README.md new file mode 100644 index 0000000..4d48565 --- /dev/null +++ b/mashkova_margarita_lab_2/README.md @@ -0,0 +1,98 @@ +# Лабораторная работа №2 +## ПИбд-42 Машкова Маргарита +## Задание +1. Согласно варианту разработать два приложения такие, что результат первого является исходными данными для второго. +2. Изучить файлы сборки образов docker и разработать их для созданных приложений. +3. Собрать файл `docker-compose.yml` для запуска приложений. Разобраться с монтированием каталогов из хост-системы. + +> Docker Compose использует файл docker-compose.yml для создания и запуска всех сервисов, определенных в конфигурации, +> с помощью одной команды. + +- Содержимое исходных файлов - целые числа. +- Результат выполнения программы 2 необходимо дополнительно вывести на экран. + +### Функциональность приложений: +- `worker-1` - Формирует файл `/var/result/data.txt` так, что каждая строка файла - количество символов в именах файлов +из каталога `/var/data`. +- `worker-2` - Ищет наименьшее число из файла `/var/result/data.txt` и сохраняет его третью степень +в `/var/result/result.txt`. + +## Запуск программы +В директории с файлом `docker-compose.yml` выполнить команду: +``` +docker-compose up -d +``` + +## Описание работы программы + +### Dockerfile сервиса `worker-1`: +``` +# Использование образа java +FROM openjdk:17 +# Создание директорий +RUN mkdir /var/data +RUN mkdir /var/result +# Рабочая директория +WORKDIR /app +# Копирование исходных файлов +COPY src/Main.java /app/Main.java +# Компиляция +RUN javac Main.java +# Запуск +CMD ["java", "Main"] +``` +Dockerfile сервиса `worker-2` аналогичен. + +### Полный файл конфигурации `docker-compose.yml`: +``` +version: '3' +services: + worker-1: + build: + context: /worker-1 + dockerfile: Dockerfile + container_name: worker-1 + volumes: # Монтирование + - .\data:/var/data + - .\result:/var/result + worker-2: + build: + context: /worker-2 + dockerfile: Dockerfile + container_name: worker-2 + depends_on: # Зависимость сервисов + - worker-1 + volumes: # Монтирование + - .\data:/var/data + - .\result:/var/result +``` + +## Запуск сервисов + +### Содержимое файлов: +Т.к. первой программе важно не содержимое файлов, а количество символов в их названиях, то файлы в директории `/data` +пустые. + +Названия файлов и количество символов в названии: +> - digits.txt (10) +> - integers.txt (12) +> - numbers.txt (11) + +Содержимое файлов каталога `/result`: +> - data.txt:
10
12
11 +> - result.txt: 1000 + +### Результат выполнения команды `docker-compose up -d`: +![Вывод в консоли](build_images.png) + +### Созданные образы: +![Созданные образы](images.png) + +### Созданные контейнеры: +![Созданные контейнеры](containers.png) + +### Результаты выполнения программ: +![results](results.png) + +Ссылка на видео: +https://youtu.be/8AG78ip0Bew diff --git a/mashkova_margarita_lab_2/build_images.png b/mashkova_margarita_lab_2/build_images.png new file mode 100644 index 0000000..3cde9eb Binary files /dev/null and b/mashkova_margarita_lab_2/build_images.png differ diff --git a/mashkova_margarita_lab_2/containers.png b/mashkova_margarita_lab_2/containers.png new file mode 100644 index 0000000..4ea65d5 Binary files /dev/null and b/mashkova_margarita_lab_2/containers.png differ diff --git a/mashkova_margarita_lab_2/data/digits.txt b/mashkova_margarita_lab_2/data/digits.txt new file mode 100644 index 0000000..e69de29 diff --git a/mashkova_margarita_lab_2/data/integers.txt b/mashkova_margarita_lab_2/data/integers.txt new file mode 100644 index 0000000..e69de29 diff --git a/mashkova_margarita_lab_2/data/numbers.txt b/mashkova_margarita_lab_2/data/numbers.txt new file mode 100644 index 0000000..e69de29 diff --git a/mashkova_margarita_lab_2/docker-compose.yml b/mashkova_margarita_lab_2/docker-compose.yml new file mode 100644 index 0000000..20d83db --- /dev/null +++ b/mashkova_margarita_lab_2/docker-compose.yml @@ -0,0 +1,20 @@ +version: '3' +services: + worker-1: + build: + context: /worker-1 + dockerfile: Dockerfile + container_name: worker-1 + volumes: # Монтирование + - .\data:/var/data + - .\result:/var/result + worker-2: + build: + context: /worker-2 + dockerfile: Dockerfile + container_name: worker-2 + depends_on: # Зависимость сервисов + - worker-1 + volumes: # Монтирование + - .\data:/var/data + - .\result:/var/result diff --git a/mashkova_margarita_lab_2/images.png b/mashkova_margarita_lab_2/images.png new file mode 100644 index 0000000..10ec22b Binary files /dev/null and b/mashkova_margarita_lab_2/images.png differ diff --git a/mashkova_margarita_lab_2/result/data.txt b/mashkova_margarita_lab_2/result/data.txt new file mode 100644 index 0000000..af6d1e4 --- /dev/null +++ b/mashkova_margarita_lab_2/result/data.txt @@ -0,0 +1,3 @@ +10 +12 +11 diff --git a/mashkova_margarita_lab_2/result/result.txt b/mashkova_margarita_lab_2/result/result.txt new file mode 100644 index 0000000..e37d32a --- /dev/null +++ b/mashkova_margarita_lab_2/result/result.txt @@ -0,0 +1 @@ +1000 \ No newline at end of file diff --git a/mashkova_margarita_lab_2/results.png b/mashkova_margarita_lab_2/results.png new file mode 100644 index 0000000..3ee94f2 Binary files /dev/null and b/mashkova_margarita_lab_2/results.png differ diff --git a/mashkova_margarita_lab_2/worker-1/Dockerfile b/mashkova_margarita_lab_2/worker-1/Dockerfile new file mode 100644 index 0000000..188a9b8 --- /dev/null +++ b/mashkova_margarita_lab_2/worker-1/Dockerfile @@ -0,0 +1,13 @@ +# Использование образа java +FROM openjdk:17 +# Создание директорий +RUN mkdir /var/data +RUN mkdir /var/result +# Рабочая директория +WORKDIR /app +# Копирование исходных файлов +COPY src/Main.java /app/Main.java +# Компиляция +RUN javac Main.java +# Запуск +CMD ["java", "Main"] \ No newline at end of file diff --git a/mashkova_margarita_lab_2/worker-1/src/Main.java b/mashkova_margarita_lab_2/worker-1/src/Main.java new file mode 100644 index 0000000..1e9b3d4 --- /dev/null +++ b/mashkova_margarita_lab_2/worker-1/src/Main.java @@ -0,0 +1,22 @@ +import java.io.*; + +// Формирует файл `/var/result/data.txt` так, что каждая строка файла - количество символов в именах файлов из каталога `/var/data`. +public class Main { + public static void main(String[] args) { + File folder = new File("/var/data"); + File[] files = folder.listFiles(); + // Запись в файл /var/result/data.txt количества символов в именах файлов из каталога /var/data построчно + try { + BufferedWriter writer = new BufferedWriter(new FileWriter("/var/result/data.txt")); + for (File file : files) { + if (file.isFile()) { + writer.write(file.getName().length() + "\n"); + } + } + writer.close(); + System.out.println("Данные успешно записаны в файл /var/result/data.txt. Программа 1 выполнилась."); + } catch (IOException e) { + System.out.println("Ошибка при записи в файл /var/result/data.txt: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/mashkova_margarita_lab_2/worker-2/Dockerfile b/mashkova_margarita_lab_2/worker-2/Dockerfile new file mode 100644 index 0000000..188a9b8 --- /dev/null +++ b/mashkova_margarita_lab_2/worker-2/Dockerfile @@ -0,0 +1,13 @@ +# Использование образа java +FROM openjdk:17 +# Создание директорий +RUN mkdir /var/data +RUN mkdir /var/result +# Рабочая директория +WORKDIR /app +# Копирование исходных файлов +COPY src/Main.java /app/Main.java +# Компиляция +RUN javac Main.java +# Запуск +CMD ["java", "Main"] \ No newline at end of file diff --git a/mashkova_margarita_lab_2/worker-2/src/Main.java b/mashkova_margarita_lab_2/worker-2/src/Main.java new file mode 100644 index 0000000..5b23447 --- /dev/null +++ b/mashkova_margarita_lab_2/worker-2/src/Main.java @@ -0,0 +1,48 @@ +import java.io.*; + +// Ищет наименьшее число из файла `/var/result/data.txt` и сохраняет его 3 степень в `/var/result/result.txt` +public class Main { + public static void main(String[] args) { + int min = Integer.MAX_VALUE; + int len = 0; + + // Чтение файла /var/result/data.txt и поиск наименьшего числа + try { + System.out.println("Содержимое файла /var/result/data.txt:"); + BufferedReader reader = new BufferedReader(new FileReader("/var/result/data.txt")); + String line = reader.readLine(); + while (line != null) { + try { + len = Integer.parseInt(line); + System.out.println(len); + if (len < min){ + min = len; + } + } catch (NumberFormatException e) { + len = -1; + } + line = reader.readLine(); + } + reader.close(); + } catch (IOException e) { + System.out.println("Ошибка при чтении файла /var/result/data.txt: " + e.getMessage()); + } + + // Возведение наименьше числа в 3 степень + int min3 = (int)Math.pow(min, 3); + + // Вывод результата на экран + String res = String.format("Наименьшее значение в файле /var/result/data.txt, возведенное в 3 степень: %d", min3); + System.out.println(res); + + // Запись результата в /var/result/result.txt + try { + BufferedWriter writer = new BufferedWriter(new FileWriter("/var/result/result.txt")); + writer.write(Integer.toString(min3)); + writer.close(); + System.out.println("Данные успешно записаны в файл /var/result/result.txt. Программа 2 выполнилась."); + } catch (IOException e) { + System.out.println("Ошибка при записи в файл /var/result/result.txt: " + e.getMessage()); + } + } +} \ No newline at end of file