Merge pull request 'arutunyan_dmitry_lab_2 is ready' (#13) from arutunyan_dmitry_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/DAS_2023_1/pulls/13
This commit is contained in:
commit
03c3b8bb6c
132
arutunyan_dmitry_lab_2/README.md
Normal file
132
arutunyan_dmitry_lab_2/README.md
Normal file
@ -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
|
1
arutunyan_dmitry_lab_2/data/rand0.txt
Normal file
1
arutunyan_dmitry_lab_2/data/rand0.txt
Normal file
@ -0,0 +1 @@
|
||||
42, 17, 99, 23, 76
|
1
arutunyan_dmitry_lab_2/data/rand2.txt
Normal file
1
arutunyan_dmitry_lab_2/data/rand2.txt
Normal file
@ -0,0 +1 @@
|
||||
29, 83, 44, 68, 91
|
1
arutunyan_dmitry_lab_2/data/rand3.txt
Normal file
1
arutunyan_dmitry_lab_2/data/rand3.txt
Normal file
@ -0,0 +1 @@
|
||||
10, 57, 72, 33, 94
|
18
arutunyan_dmitry_lab_2/docker-compose.yaml
Normal file
18
arutunyan_dmitry_lab_2/docker-compose.yaml
Normal file
@ -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
|
BIN
arutunyan_dmitry_lab_2/pic1.png
Normal file
BIN
arutunyan_dmitry_lab_2/pic1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 MiB |
BIN
arutunyan_dmitry_lab_2/pic2.png
Normal file
BIN
arutunyan_dmitry_lab_2/pic2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 54 KiB |
1
arutunyan_dmitry_lab_2/result/data.txt
Normal file
1
arutunyan_dmitry_lab_2/result/data.txt
Normal file
@ -0,0 +1 @@
|
||||
55, 12, 88, 37, 61
|
1
arutunyan_dmitry_lab_2/result/result.txt
Normal file
1
arutunyan_dmitry_lab_2/result/result.txt
Normal file
@ -0,0 +1 @@
|
||||
3355
|
10
arutunyan_dmitry_lab_2/worker-1/Dockerfile
Normal file
10
arutunyan_dmitry_lab_2/worker-1/Dockerfile
Normal file
@ -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"]
|
37
arutunyan_dmitry_lab_2/worker-1/src/Main.java
Normal file
37
arutunyan_dmitry_lab_2/worker-1/src/Main.java
Normal file
@ -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();
|
||||
}
|
||||
}
|
10
arutunyan_dmitry_lab_2/worker-2/Dockerfile
Normal file
10
arutunyan_dmitry_lab_2/worker-2/Dockerfile
Normal file
@ -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"]
|
32
arutunyan_dmitry_lab_2/worker-2/src/Main.java
Normal file
32
arutunyan_dmitry_lab_2/worker-2/src/Main.java
Normal file
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user