diff --git a/arutunyan_dmitry_lab_2/README.md b/arutunyan_dmitry_lab_2/README.md new file mode 100644 index 0000000..5a59520 --- /dev/null +++ b/arutunyan_dmitry_lab_2/README.md @@ -0,0 +1,132 @@ + +## Лабораторная работа 2. Вариант 4. +### Задание +- Разработать два приложения такие, что результат первого является исходными данными для второго. +- Изучить файлы сборки образов `docker` и разработать их для созданных приложений. +- Собрать файл `docker-compose.yaml` для запуска приложений. Разобраться с монтированием каталогов из хост-системы. + +Вариант задания: +- `worker-1` - Берёт из каталога `/var/data` случайный файл и перекладывает его в `/var/result/data.txt`. +- `worker-2` - Сохраняет произведение первого и последнего числа из файла `/var/data/data.txt` в `/var/result/result.txt`. + +### Как запустить +В директории с файлом характеристик `docker-compose.yaml` выполнить команду: +``` +docker-compose -f docker-compose.yaml up +``` +Это запустит `docker-compose`, который развернёт в общем контейнере 2 контейнера с сервисами по собранным из `Dockerfile` образам. + +### Описание работы +#### Подготовка файлов +В корневой папке лабораторной работы создадим две директории: `data` и `result`. Директория `data` будет являться удалённой директорией с входными файлами для 1го приложения. + +Входные файлы и их содержание: +``` +rand0.txt - 42, 17, 99, 23, 76 +rand1.txt - 55, 12, 88, 37, 61 +rand2.txt - 29, 83, 44, 68, 91 +rand3.txt - 10, 57, 72, 33, 94 +``` +Директория `result` будет служить далённой директорией с входными файлами для 2го приложения и удалённой директорией для выходного файла 1го приложения, поэтому оставляем её пустой. + +#### Разработка приложения Worker-1 +Согласно заданию, `worker-1` берёт из каталога `/var/data` случайный файл и перекладывает его в `/var/result/data.txt`. +Приложение реализовано на языке Java. + +Код логической части приложения: +```java +Files.move(files[rm.nextInt(files.length)].toPath(), + new File(result_directory).toPath(), StandardCopyOption.REPLACE_EXISTING); +``` +Для сборки образа и запуска приложения в контейнере создадим `Dockerfile`: +```dockerfile +FROM openjdk:21-jdk + +RUN ["mkdir", "/var/data"] +RUN ["mkdir", "/var/result"] + +COPY src/Main.java /opt/app/Main.java +WORKDIR /opt/app + +RUN ["javac", "Main.java"] +CMD ["java", "Main"] +``` +В данном файле с помощью функции `RUN` мы передаём в `bash` среду созданного контейнера комманды создания входных и выходных директорий `mkdir /var/data` и `mkdir /var/result`. После этого мы задаём в контейнере рабочую директорию, копируем исполняемый класс приложения в рабочую директорию и компилируем его. При запуске контейнера с помощью функции `CMD` указыыаем действие `java Main` запуска приложения. + +#### Разработка приложения Worker-2 +Согласно заданию, `worker-2` сохраняет произведение первого и последнего числа из файла `/var/data/data.txt` в `/var/result/result.txt`. +Приложение реализовано на языке Java. + +Код логической части приложения: +```java +Scanner scanner = new Scanner(data_file); +int[] num = Arrays.stream(scanner.nextLine().split(", ")) + .mapToInt(Integer::parseInt) + .toArray(); +scanner.close(); +FileWriter writer = new FileWriter(result_file); +writer.write(num[0] * num[num.length - 1] + ""); +writer.close(); +System.out.println("" + (num[0] * num[num.length - 1])); +``` +Для сборки образа и запуска приложения в контейнере создадим `Dockerfile`: +```dockerfile +FROM openjdk:21-jdk + +RUN ["mkdir", "/var/data"] +RUN ["mkdir", "/var/result"] + +COPY src/Main.java /opt/app/Main.java +WORKDIR /opt/app + +RUN ["javac", "Main.java"] +CMD ["java", "Main"] +``` +Логика сборки образа приложения `worker-2` идентична логике приложения `worker-1`. + +#### Разворачивание приложений +Конфигурации `worker-1` в `docker-compose.yaml`: +```yaml +worker-1: + build: + context: /worker-1 + dockerfile: Dockerfile + volumes: + - .\data:/var/data + - .\result:/var/result +``` +Где `build` указывает на метод сборки образа в котором: `context` указывает на корневую директорию приложения, а `dockerfile` указывает на путь к `Dockerfile`,`volumes` устанавливает локальную папку `data` как папку входных файлов `/var/data`, а локальную папку `result` - как папку выходных файлов `/var/result`. + +Конфигурации `worker-2` в `docker-compose.yaml`: +```yaml +worker-2: + depends_on: + - worker-1 + build: + context: /worker-2 + dockerfile: Dockerfile + volumes: + - .\result:/var/data + - .\result:/var/result +``` +Где `depends_on` указывает на зависимость от 1го приложения и возможность запуска только после него, `build` указывает на метод сборки образа в котором: `context` указывает на корневую директорию приложения, а `dockerfile` указывает на путь к `Dockerfile`,`volumes` устанавливает локальную папку `result` как папку входных файлов `/var/data` и как папку выходных файлов `/var/result` одновременно. + +#### Запуск приложений +Выполнение команды docker-compose и log-журнал контейнеров: +![](pic1.png "") +![](pic2.png "") + +Файлы директоиии `data` и их содержание: +``` +rand0.txt - 42, 17, 99, 23, 76 +rand2.txt - 29, 83, 44, 68, 91 +rand3.txt - 10, 57, 72, 33, 94 +``` +Файлы директоиии `result` и их содержание: +``` +data.txt - 55, 12, 88, 37, 61 +result.txt - 3355 +``` + +### Видео +https://youtu.be/WASbBhDiAwg \ No newline at end of file diff --git a/arutunyan_dmitry_lab_2/data/rand0.txt b/arutunyan_dmitry_lab_2/data/rand0.txt new file mode 100644 index 0000000..7a1ae06 --- /dev/null +++ b/arutunyan_dmitry_lab_2/data/rand0.txt @@ -0,0 +1 @@ +42, 17, 99, 23, 76 \ No newline at end of file diff --git a/arutunyan_dmitry_lab_2/data/rand2.txt b/arutunyan_dmitry_lab_2/data/rand2.txt new file mode 100644 index 0000000..123d6f3 --- /dev/null +++ b/arutunyan_dmitry_lab_2/data/rand2.txt @@ -0,0 +1 @@ +29, 83, 44, 68, 91 \ No newline at end of file diff --git a/arutunyan_dmitry_lab_2/data/rand3.txt b/arutunyan_dmitry_lab_2/data/rand3.txt new file mode 100644 index 0000000..47d02f1 --- /dev/null +++ b/arutunyan_dmitry_lab_2/data/rand3.txt @@ -0,0 +1 @@ +10, 57, 72, 33, 94 \ No newline at end of file diff --git a/arutunyan_dmitry_lab_2/docker-compose.yaml b/arutunyan_dmitry_lab_2/docker-compose.yaml new file mode 100644 index 0000000..02175fd --- /dev/null +++ b/arutunyan_dmitry_lab_2/docker-compose.yaml @@ -0,0 +1,18 @@ +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 \ No newline at end of file diff --git a/arutunyan_dmitry_lab_2/pic1.png b/arutunyan_dmitry_lab_2/pic1.png new file mode 100644 index 0000000..9eab185 Binary files /dev/null and b/arutunyan_dmitry_lab_2/pic1.png differ diff --git a/arutunyan_dmitry_lab_2/pic2.png b/arutunyan_dmitry_lab_2/pic2.png new file mode 100644 index 0000000..297fcd4 Binary files /dev/null and b/arutunyan_dmitry_lab_2/pic2.png differ diff --git a/arutunyan_dmitry_lab_2/result/data.txt b/arutunyan_dmitry_lab_2/result/data.txt new file mode 100644 index 0000000..86fc989 --- /dev/null +++ b/arutunyan_dmitry_lab_2/result/data.txt @@ -0,0 +1 @@ +55, 12, 88, 37, 61 \ No newline at end of file diff --git a/arutunyan_dmitry_lab_2/result/result.txt b/arutunyan_dmitry_lab_2/result/result.txt new file mode 100644 index 0000000..76ce2a5 --- /dev/null +++ b/arutunyan_dmitry_lab_2/result/result.txt @@ -0,0 +1 @@ +3355 \ No newline at end of file diff --git a/arutunyan_dmitry_lab_2/worker-1/Dockerfile b/arutunyan_dmitry_lab_2/worker-1/Dockerfile new file mode 100644 index 0000000..f8bca83 --- /dev/null +++ b/arutunyan_dmitry_lab_2/worker-1/Dockerfile @@ -0,0 +1,10 @@ +FROM openjdk:21-jdk + +RUN ["mkdir", "/var/data"] +RUN ["mkdir", "/var/result"] + +COPY src/Main.java /opt/app/Main.java +WORKDIR /opt/app + +RUN ["javac", "Main.java"] +CMD ["java", "Main"] \ No newline at end of file diff --git a/arutunyan_dmitry_lab_2/worker-1/src/Main.java b/arutunyan_dmitry_lab_2/worker-1/src/Main.java new file mode 100644 index 0000000..dca30d6 --- /dev/null +++ b/arutunyan_dmitry_lab_2/worker-1/src/Main.java @@ -0,0 +1,37 @@ +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.Random; + +public class Main { + + public static final String data_directory = "/var/data"; // Директория с файлами входных данных + public static final String result_directory = "/var/result/data.txt"; // Директррия для входных файлов worker-2 + + public static void DoWork() { + Random rm = new Random(); + File data_d = new File(data_directory); + + if (data_d.exists() && data_d.isDirectory()) { + File[] files = data_d.listFiles(); // Считывание списка файлов + if (files != null) { + try { + Files.move(files[rm.nextInt(files.length)].toPath(), // Перемещение случайного файла + new File(result_directory).toPath(), StandardCopyOption.REPLACE_EXISTING); + System.out.println("Файл успешно перемещен."); + } catch (IOException e) { + System.out.println("Ошибка при перемещении файла: " + e.getMessage()); + } + } else { + System.out.println("Указанная директория не содержит файлов."); + } + } else { + System.out.println("Указанная директория не существует или не является директорией."); + } + } + + public static void main(String[] args) { + DoWork(); + } +} \ No newline at end of file diff --git a/arutunyan_dmitry_lab_2/worker-2/Dockerfile b/arutunyan_dmitry_lab_2/worker-2/Dockerfile new file mode 100644 index 0000000..f8bca83 --- /dev/null +++ b/arutunyan_dmitry_lab_2/worker-2/Dockerfile @@ -0,0 +1,10 @@ +FROM openjdk:21-jdk + +RUN ["mkdir", "/var/data"] +RUN ["mkdir", "/var/result"] + +COPY src/Main.java /opt/app/Main.java +WORKDIR /opt/app + +RUN ["javac", "Main.java"] +CMD ["java", "Main"] \ No newline at end of file diff --git a/arutunyan_dmitry_lab_2/worker-2/src/Main.java b/arutunyan_dmitry_lab_2/worker-2/src/Main.java new file mode 100644 index 0000000..24d06de --- /dev/null +++ b/arutunyan_dmitry_lab_2/worker-2/src/Main.java @@ -0,0 +1,32 @@ +import java.io.File; +import java.io.FileWriter; +import java.util.Arrays; +import java.util.Scanner; + +public class Main { + + public static final File data_file = new File("/var/data/data.txt"); // Выходной файл worker-1 + public static File result_file = new File("/var/result/result.txt"); // Файл результат выполнения кода + + public static void DoWork() { + try { + Scanner scanner = new Scanner(data_file); + int[] num = Arrays.stream(scanner.nextLine().split(", ")) + .mapToInt(Integer::parseInt) + .toArray(); // Считыание чисел с файла + scanner.close(); + + FileWriter writer = new FileWriter(result_file); + writer.write(num[0] * num[num.length - 1] + ""); // Запись произведения 1го и последнего числа входного файла + writer.close(); + + System.out.println("Произведение 1го и последнего числа файла data.txt: " + (num[0] * num[num.length - 1])); + } catch (Exception e) { + System.out.println("Проблема при работе с файлом: " + e.getMessage()); + } + } + + public static void main(String[] args) { + DoWork(); + } +} \ No newline at end of file