Merge pull request 'mashkova_margarita_lab_2 ready' (#54) from mashkova_margarita_lab_2 into main

Reviewed-on: http://student.git.athene.tech/Alexey/DAS_2023_1/pulls/54
This commit is contained in:
Alexey 2023-12-25 12:18:29 +04:00
commit 33c9790fef
15 changed files with 218 additions and 0 deletions

View File

@ -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: <br>10<br> 12<br> 11
> - result.txt: 1000
### Результат выполнения команды `docker-compose up -d`:
![Вывод в консоли](build_images.png)
### Созданные образы:
![Созданные образы](images.png)
### Созданные контейнеры:
![Созданные контейнеры](containers.png)
### Результаты выполнения программ:
![results](results.png)
Ссылка на видео:
https://youtu.be/8AG78ip0Bew

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,3 @@
10
12
11

View File

@ -0,0 +1 @@
1000

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -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"]

View File

@ -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());
}
}
}

View File

@ -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"]

View File

@ -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());
}
}
}