This commit is contained in:
Eugene Kazakov 2023-10-17 10:12:55 +03:00
parent 7a6fa0a5e4
commit 870fae65ac
13 changed files with 162 additions and 48 deletions

View File

@ -0,0 +1,72 @@
# Отчёт по лабораторной работе №2
Выполнил: студент гр. ИСЭбд-41 Казаков Евгений.
Вариант программы 1: Ищет в каталоге `/var/data` самый большой по объёму файл и перекладывает его в `/var/result/data.txt`.
Вариант программы 2: Ищет набольшее число из файла `/var/data/data.txt` и сохраняет его вторую степень в `/var/result/result.txt`.
## Создание приложений
Создадим 2 приложения.
Был выбран язык C# и технология .NET 7, потому что хочется.
Для создания обычных консольных приложений воспользуемся командами:
```sh
dotnet new console -o worker-1
dotnet new console -o worker-2
```
Согласно варианту программа 1 должна брать все файлы из папки `/var/data`, получать их размер и отправлять в `/var/result/data.txt`.
[Исходный текст программы worker-1](worker-1/Program.cs)
Согласно варианту программа 2 должна брать строки из файла `/var/data/data.txt`, пытаться привести их к числам, а затем найти болшее и влзвести его в степень 2.
Затем результат вычислений копируется в файл `/var/result/result.txt`.
[Исходный текст программы worker-2](worker-2/Program.cs)
Дополнительно создан файл [.gitignore](.gitignore) для того, чтобы не закоммитить в git ничего лишнего.
## Настройка окружения
Для связи двух приложений воспользуемся следующей схемой:
1. Каталог `./data` должен быть примонтирован в каталог `/var/data` для программы 1.
Оттуда будут браться исходные данные.
2. Каталог `./result-1` должен быть примонтирован в каталог `/var/result` для программы 2.
Туда будут складываться промежуточные данные.
3. Каталог `./result-1` также должен быть примонтирован в каталог `/var/data` для программы 2.
Оттуда будут браться промежуточные результаты.
4. Каталог `./result` должен быть примонтирован в каталог `/var/result` для программы 2.
Туда будут складывать результаты финальной обработки.
Для каждой программы были созданы файлы Dockerfile ([программа 1](worker-1/Dockerfile), [программа 2](worker-1/Dockerfile)) с подробным описанием процесса сборки.
Был создан файл [docker-compose.yml](docker-compose.yml), в котором указан манифест для запуска распределённого приложения.
Дополнительно был создан файл [.dockerignore](.dockerignore) и дополнен [.gitignore](.gitignore), чтобы исключить для сборки и коммита всё лишнее.
## Сборка и запуск
В каталог `./data` помещены 2 файла.
Первый-самый большой файл по размеру, во втором - 100.
Для запуска приложения необходимо ввести команду `docker compose up ---build`.
Результат запуска после сборки:
```
[+] Running 2/2
✔ Container lab_2-worker-1-1 Created 0.0s
✔ Container lab_2-worker-2-1 Recreated 0.1s
Attaching to lab_2-worker-1-1, lab_2-worker-2-1
lab_2-worker-1-1 exited with code 0
lab_2-worker-2-1 | 100
lab_2-worker-2-1 exited with code 0
```
В результате в каталоге `./result` создался файл `result.txt` с содержимым `100`, что соответствует входным данным.
Изменение значений в файлах из каталога `./data` также изменяет содержимое в файлах из каталогов `./result-1` и `./result`.

View File

@ -0,0 +1,8 @@
1
4
5
6
7
8
9
10

View File

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

View File

@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59 VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1\worker-1.csproj", "{9432BCDF-7776-40B2-BBBC-AC6715AD0B17}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1\worker-1.csproj", "{DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2\worker-2.csproj", "{F27277D5-063E-4DE2-B614-6BD2B30D0341}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2\worker-2.csproj", "{F5373868-285B-43A5-A593-C6E64B28B404}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -16,13 +16,13 @@ Global
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Debug|Any CPU.Build.0 = Debug|Any CPU {DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Release|Any CPU.ActiveCfg = Release|Any CPU {DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Release|Any CPU.Build.0 = Release|Any CPU {DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Release|Any CPU.Build.0 = Release|Any CPU
{F27277D5-063E-4DE2-B614-6BD2B30D0341}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F5373868-285B-43A5-A593-C6E64B28B404}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F27277D5-063E-4DE2-B614-6BD2B30D0341}.Debug|Any CPU.Build.0 = Debug|Any CPU {F5373868-285B-43A5-A593-C6E64B28B404}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F27277D5-063E-4DE2-B614-6BD2B30D0341}.Release|Any CPU.ActiveCfg = Release|Any CPU {F5373868-285B-43A5-A593-C6E64B28B404}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F27277D5-063E-4DE2-B614-6BD2B30D0341}.Release|Any CPU.Build.0 = Release|Any CPU {F5373868-285B-43A5-A593-C6E64B28B404}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View File

@ -0,0 +1,8 @@
1
4
5
6
7
8
9
10

View File

@ -0,0 +1 @@
100

View File

@ -1,5 +0,0 @@
1
1
1
1
1

View File

@ -1,10 +0,0 @@
10
10
10
10
10
10
10
10
10
10

View File

@ -0,0 +1,17 @@
#задаем базовый образ на .net 7.0
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env
#задаем рабочую директорию
WORKDIR /src
#в каталог копируем файлы и папки в контейнер
COPY . ./
#создаем образы и устанавливаем данные пакеты в контейнер
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /publish
FROM mcr.microsoft.com/dotnet/aspnet:7.0 as runtime
WORKDIR /publish
COPY --from=build-env /publish .
#вызываем приложение во время выполнения контейнера
ENTRYPOINT ["dotnet", "worker-1.dll"]

View File

@ -1,22 +1,24 @@
using System.Text; using System.Text;
string[] files = Directory.GetFiles("/var/data"); string[] files = Directory.GetFiles("../../../../var/data");
string maxFilePath = ""; string FilePath = "";
long maxL = 0; long maxFileLenght = 0;
foreach(var filePath in files){ foreach(var filePath in files){
FileInfo fileInfo = new FileInfo(filePath); FileInfo fileInfo = new FileInfo(filePath);
if(fileInfo.Length > maxL){ if(fileInfo.Length > maxFileLenght){
maxL = fileInfo.Length; maxFileLenght = fileInfo.Length;
maxFilePath = filePath; FilePath = filePath;
} }
} }
using (FileStream fstream = File.OpenRead(maxFilePath)){ using (FileStream fstream = File.OpenRead(FilePath)){
byte[] buffer = new byte[fstream.Length]; byte[] buffer = new byte[fstream.Length];
await fstream.ReadAsync(buffer, 0, buffer.Length); await fstream.ReadAsync(buffer, 0, buffer.Length);
string text = Encoding.Default.GetString(buffer); string text = Encoding.Default.GetString(buffer);
using(FileStream fstream1 = new FileStream("/var/result/data.txt", FileMode.OpenOrCreate)){ using(FileStream fstream1 = new FileStream("../../../../var/result/data.txt", FileMode.OpenOrCreate)){
fstream1.SetLength(0); fstream1.SetLength(0);
byte[] buffer1 = Encoding.Default.GetBytes(text); byte[] buffer1 = Encoding.Default.GetBytes(text);
await fstream1.WriteAsync(buffer1, 0, buffer1.Length); await fstream1.WriteAsync(buffer1, 0, buffer1.Length);
} }
} }

View File

@ -0,0 +1,17 @@
#задаем базовый образ на .net 6.0
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env
#задаем рабочую директорию
WORKDIR /src
#в каталог копируем файлы и папки в контейнер
COPY . ./
#создаем образы и устанавливаем данные пакеты в контейнер
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /publish
FROM mcr.microsoft.com/dotnet/aspnet:7.0 as runtime
WORKDIR /publish
COPY --from=build-env /publish .
#вызываем приложение во время выполнения контейнера
ENTRYPOINT ["dotnet", "worker-2.dll"]

View File

@ -1,23 +1,23 @@
using System.Text; using System.Text;
int[] numbers = File.ReadAllLines("../../../../var/data/data.txt").Select(x=> int.Parse(x)).ToArray(); string[] numbers;
using (FileStream fstream = File.OpenRead("../../../../var/result/data.txt")){
byte[] buffer = new byte[fstream.Length];
await fstream.ReadAsync(buffer, 0, buffer.Length);
string text = Encoding.Default.GetString(buffer);
text = text.Replace("\r\n",";");
numbers = text.Split(new char[]{';'});
}
int maxNumber = 0; int maxNumber = 0;
int maxNumberCount = 0; int n = 0;
foreach(var number in numbers){ foreach(var number in numbers){
if(number < maxNumber){ if(Convert.ToInt32(number) > maxNumber){
continue; maxNumber = Convert.ToInt32(number);
} n = maxNumber*maxNumber;
if(number == maxNumber){
maxNumberCount++;
continue;
}
if(number > maxNumber){
maxNumber = number;
maxNumberCount = 1;
} }
} }
using(FileStream fstream = new FileStream("../../../../var/result/result.txt", FileMode.OpenOrCreate)){ using(FileStream fstream = new FileStream("../../../../var/result/result.txt", FileMode.OpenOrCreate)){
byte[] buffer = Encoding.Default.GetBytes(maxNumberCount.ToString()); byte[] buffer = Encoding.Default.GetBytes(n.ToString());
await fstream.WriteAsync(buffer, 0, buffer.Length); await fstream.WriteAsync(buffer, 0, buffer.Length);
} }
Console.WriteLine(maxNumberCount); Console.WriteLine(n);