belyaeva lab2 ready #112
81
belyaeva_ekaterina_lab_2/README.md
Normal file
81
belyaeva_ekaterina_lab_2/README.md
Normal 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)
|
18
belyaeva_ekaterina_lab_2/docker-compose.yml
Normal file
18
belyaeva_ekaterina_lab_2/docker-compose.yml
Normal 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 #том для папки результатов
|
BIN
belyaeva_ekaterina_lab_2/lab2.mp4
Normal file
BIN
belyaeva_ekaterina_lab_2/lab2.mp4
Normal file
Binary file not shown.
7
belyaeva_ekaterina_lab_2/var/data/txt1.txt
Normal file
7
belyaeva_ekaterina_lab_2/var/data/txt1.txt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
4
belyaeva_ekaterina_lab_2/var/data/txt2.txt
Normal file
4
belyaeva_ekaterina_lab_2/var/data/txt2.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
10
|
||||||
|
20
|
||||||
|
30
|
||||||
|
40
|
5
belyaeva_ekaterina_lab_2/var/data/txt3.txt
Normal file
5
belyaeva_ekaterina_lab_2/var/data/txt3.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
5
|
||||||
|
10
|
||||||
|
15
|
||||||
|
20
|
||||||
|
25
|
3
belyaeva_ekaterina_lab_2/var/result/data.txt
Normal file
3
belyaeva_ekaterina_lab_2/var/result/data.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
1
|
||||||
|
10
|
||||||
|
5
|
1
belyaeva_ekaterina_lab_2/var/result/result.txt
Normal file
1
belyaeva_ekaterina_lab_2/var/result/result.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
100
|
12
belyaeva_ekaterina_lab_2/worker-1/Dockerfile
Normal file
12
belyaeva_ekaterina_lab_2/worker-1/Dockerfile
Normal 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"]
|
62
belyaeva_ekaterina_lab_2/worker-1/src/Main.java
Normal file
62
belyaeva_ekaterina_lab_2/worker-1/src/Main.java
Normal 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
belyaeva_ekaterina_lab_2/worker-2/Dockerfile
Normal file
12
belyaeva_ekaterina_lab_2/worker-2/Dockerfile
Normal 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"]
|
68
belyaeva_ekaterina_lab_2/worker-2/src/Main.java
Normal file
68
belyaeva_ekaterina_lab_2/worker-2/src/Main.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user