belyaeva lab2 ready #112

Merged
Alexey merged 1 commits from belyaeva_ekaterina_lab_2 into main 2024-01-13 09:39:01 +04:00
12 changed files with 273 additions and 0 deletions

View File

@ -0,0 +1,81 @@
# Лабораторная работа №2
## Задание
Цель: изучение техники создания простого распределённого приложения.
Задачи:
- Согласно варианту (0 и 1) разработать два приложения такие, что результат первого является исходными данными для второго.
- Изучить файлы сборки образов docker и разработать их для созданных приложений.
- Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
- Правильно закоммитить результат без лишних файлов.
- Оформить pull request по правилам и отправить его на проверку.
## Ход работы
### Разворачивание сервисов:
Были разработаны два приложения на java:
worker-1 - Формирует файл /var/result/data.txt из первых строк всех файлов каталога /var/data.
worker-2 - Ищет набольшее число из файла /var/result/data.txt и сохраняет его вторую степень в /var/result/result.txt.
### Исходные файлы
Исходные файлы содержат целые числа.
В /var/result/data.txt копируются числа из первых строк каждого файла - 1, 10, 5
В /var/result/result.txt записывается число 100 - квадрат наибольшего числа - 10
Содержимое всех файлов показано в видео.
### Dockerfile
Для лр были созданы идентичные докер-файлы в обоих проектах:
```
FROM openjdk:17
LABEL authors="tauri"
RUN mkdir /var/data
RUN mkdir /var/result
WORKDIR /app
COPY src /app/src
RUN javac /app/src/Main.java
CMD ["java", "-cp", "/app/src", "Main"]
```
- FROM - выбор базового образа
- LABEL - метка, что автор - tauri
- RUN - создание директории внутри контейнера
- WORKDIR - установка рабочей директории для последующих команд
- COPY - копирование содержимого директории внутрь контейнера
- RUN - компиляция исходного кода Main.java внутри контейнера
- CMD - определение команды, которая выполняется при запуске контейнера. В данном случае происходит запуск программы на java и указывается пусть до Main.java
### docker-compose.yml
```
version: "3" #формат конфигурации Docker Compose версии 3
services: #определение сервисов
worker1:
build:
context: /worker-1 #путь к контексту сборки
dockerfile: Dockerfile #имя докерфайла
volumes:
- .\var\data:/var/data #том для папки файлов
- .\var\result:/var/result #том для папки результатов
worker2:
depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск
- worker1
build:
context: /worker-2 #путь к контексту сборки
dockerfile: Dockerfile #имя докерфайла
volumes:
- .\var\result:/var/data #том для папки файлов
- .\var\result:/var/result #том для папки результатов
```
Работоспособность и то, что контейнеры были успешно развернуты показано в видео: [lab2.mp4](lab2.mp4)

View File

@ -0,0 +1,18 @@
version: "3" #формат конфигурации Docker Compose версии 3
services: #определение сервисов
worker1:
build:
context: /worker-1 #путь к контексту сборки
dockerfile: Dockerfile #имя докерфайла
volumes:
- .\var\data:/var/data #том для папки файлов
- .\var\result:/var/result #том для папки результатов
worker2:
depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск
- worker1
build:
context: /worker-2 #путь к контексту сборки
dockerfile: Dockerfile #имя докерфайла
volumes:
- .\var\result:/var/data #том для папки файлов
- .\var\result:/var/result #том для папки результатов

Binary file not shown.

View File

@ -0,0 +1,7 @@
1
2
3
4
5
6
7

View File

@ -0,0 +1,4 @@
10
20
30
40

View File

@ -0,0 +1,5 @@
5
10
15
20
25

View File

@ -0,0 +1,3 @@
1
10
5

View File

@ -0,0 +1 @@
100

View File

@ -0,0 +1,12 @@
FROM openjdk:17
LABEL authors="tauri"
RUN mkdir /var/data
RUN mkdir /var/result
WORKDIR /app
COPY src /app/src
RUN javac /app/src/Main.java
CMD ["java", "-cp", "/app/src", "Main"]

View File

@ -0,0 +1,62 @@
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
String directoryPath = "/var/data";
String resultFilePath = "/var/result/data.txt";
File directory = new File(directoryPath);
File resultFile = new File(resultFilePath);
try {
// Создаем новый файл-результат или перезаписываем существующий
resultFile.createNewFile();
// Получаем список всех файлов в указанном каталоге
File[] files = directory.listFiles();
// Проверяем, что каталог существует и содержит файлы
if (directory.exists() && files != null) {
// Создаем объект для записи данных в файл-результат
FileWriter fileWriter = new FileWriter(resultFile);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
// Проходимся по всем файлам в каталоге
for (File file : files) {
// Проверяем, что текущий объект - файл
if (file.isFile()) {
// Создаем объект для чтения данных из файла
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
// Читаем строку из файла и записываем ее в файл-результат
String line = bufferedReader.readLine();
if (line != null) {
bufferedWriter.write(line);
bufferedWriter.newLine();
}
// Закрываем объекты чтения данных из файла
bufferedReader.close();
fileReader.close();
}
}
// Закрываем объект для записи данных в файл-результат
bufferedWriter.close();
fileWriter.close();
System.out.println("Файл /var/result/data.txt успешно создан.");
} else {
System.out.println("Указанный каталог не существует или не содержит файлы.");
}
} catch (IOException e) {
System.out.println("Ошибка при создании файла: " + e.getMessage());
}
}
}

View File

@ -0,0 +1,12 @@
FROM openjdk:17
LABEL authors="tauri"
RUN mkdir /var/data
RUN mkdir /var/result
WORKDIR /app
COPY src /app/src
RUN javac /app/src/Main.java
CMD ["java", "-cp", "/app/src", "Main"]

View File

@ -0,0 +1,68 @@
import java.io.*;
import java.util.*;
import java.lang.Math;
public class Main {
public static void main(String[] args) {
String filePath = "/var/data/data.txt";
String resultPath = "/var/result/result.txt";
try {
// Чтение чисел из файла
List<Integer> numbers = readNumbersFromFile(filePath);
// Поиск наибольшего числа
int maxNumber = findMaxNumber(numbers);
// Вычисление второй степени
int squaredNumber = (int) Math.pow(maxNumber, 2);
// Сохранение результата в файл
saveResultToFile(resultPath, squaredNumber);
System.out.println("Наибольшее число: " + maxNumber);
System.out.println("Квадрат наибольшего числа: " + squaredNumber);
System.out.println("Результат сохранен в файле " + resultPath);
} catch (IOException e) {
System.out.println("Произошла ошибка при чтении/записи файла.");
e.printStackTrace();
}
}
// Метод для чтения чисел из файла
private static List<Integer> readNumbersFromFile(String filePath) throws IOException {
List<Integer> numbers = new ArrayList<>();
BufferedReader reader = new BufferedReader(new FileReader(filePath));
String line;
while ((line = reader.readLine()) != null) {
int number = Integer.parseInt(line.trim());
numbers.add(number);
}
reader.close();
return numbers;
}
// Метод для поиска наибольшего числа в списке
private static int findMaxNumber(List<Integer> numbers) {
int maxNumber = Integer.MIN_VALUE;
for (int number : numbers) {
if (number > maxNumber) {
maxNumber = number;
}
}
return maxNumber;
}
// Метод для сохранения результата в файл
private static void saveResultToFile(String filePath, int result) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));
writer.write(String.valueOf(result));
writer.close();
}
}