From 914653f0d49bd3dbd355980fa10b668464ed4e26 Mon Sep 17 00:00:00 2001 From: MYTARIN_EVGENY_ISEBD-41 Date: Mon, 9 Oct 2023 22:26:37 +0300 Subject: [PATCH] done --- tasks/mytarin_es/lab2/.gitignore | 477 ++++++++++++++++++ tasks/mytarin_es/lab2/README.md | 77 +++ tasks/mytarin_es/lab2/data/copy.txt | 3 + tasks/mytarin_es/lab2/data/data.txt | 9 + tasks/mytarin_es/lab2/docker-compose.yml | 18 + tasks/mytarin_es/lab2/im1.png | Bin 0 -> 23150 bytes tasks/mytarin_es/lab2/lab2.sln | 28 + tasks/mytarin_es/lab2/result-1/data.txt | 9 + tasks/mytarin_es/lab2/result/result.txt | 1 + tasks/mytarin_es/lab2/worker-1/Dockerfile | 16 + tasks/mytarin_es/lab2/worker-1/Program.cs | 38 ++ .../mytarin_es/lab2/worker-1/worker-1.csproj | 11 + tasks/mytarin_es/lab2/worker-2/Dockerfile | 16 + tasks/mytarin_es/lab2/worker-2/Program.cs | 32 ++ .../mytarin_es/lab2/worker-2/worker-2.csproj | 11 + 15 files changed, 746 insertions(+) create mode 100644 tasks/mytarin_es/lab2/.gitignore create mode 100644 tasks/mytarin_es/lab2/README.md create mode 100644 tasks/mytarin_es/lab2/data/copy.txt create mode 100644 tasks/mytarin_es/lab2/data/data.txt create mode 100644 tasks/mytarin_es/lab2/docker-compose.yml create mode 100644 tasks/mytarin_es/lab2/im1.png create mode 100644 tasks/mytarin_es/lab2/lab2.sln create mode 100644 tasks/mytarin_es/lab2/result-1/data.txt create mode 100644 tasks/mytarin_es/lab2/result/result.txt create mode 100644 tasks/mytarin_es/lab2/worker-1/Dockerfile create mode 100644 tasks/mytarin_es/lab2/worker-1/Program.cs create mode 100644 tasks/mytarin_es/lab2/worker-1/worker-1.csproj create mode 100644 tasks/mytarin_es/lab2/worker-2/Dockerfile create mode 100644 tasks/mytarin_es/lab2/worker-2/Program.cs create mode 100644 tasks/mytarin_es/lab2/worker-2/worker-2.csproj diff --git a/tasks/mytarin_es/lab2/.gitignore b/tasks/mytarin_es/lab2/.gitignore new file mode 100644 index 0000000..154e127 --- /dev/null +++ b/tasks/mytarin_es/lab2/.gitignore @@ -0,0 +1,477 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk diff --git a/tasks/mytarin_es/lab2/README.md b/tasks/mytarin_es/lab2/README.md new file mode 100644 index 0000000..c933d7d --- /dev/null +++ b/tasks/mytarin_es/lab2/README.md @@ -0,0 +1,77 @@ +# Отчёт по лабораторной работе №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`. + +[Исходный текст программы worker-1](worker-1/Program.cs) + +Согласно варианту программа 2 должна брать строки из папки `/var/data/` с скопированным файлом, пытаться привести их к числам, затем найти минимальное из них. +Далее найти количество вхождений этого числа и результат записать в файл `/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 файла с различным объемом. + +![](im1.PNG) + +В процессе выполнения программа должна перенести содержимое файла data.txt из каталога /data в /result (т.к. он меньше по объему) и выдать результат произведения первого и последнего числа этого файла. +![](image1.PNG) + +Для запуска приложения необходимо ввести команду `docker compose up --build`. +Результат запуска после сборки: + +``` +[+] Running 2/2 + ✔ Container lab_2-worker-1-1 Created 0.0s + ✔ Container lab_2-worker-2-1 Created 0.1s +Attaching to lab2-worker-1-1, lab2-worker-2-1 +lab2-worker-1-1 | Программа 1 завершена +lab2-worker-1-1 exited with code 0 +lab2-worker-2-1 | Программа 2 завершена +lab2-worker-2-1 | Результат: 30 +lab2-worker-2-1 exited with code 0 +``` + +В результате в каталоге `./result` в файл `result.txt` было записано число 30. + +Изменение значений в файлах из каталога `./data` также изменяет содержимое в файлах из каталогов `./result-1` и `./result`. \ No newline at end of file diff --git a/tasks/mytarin_es/lab2/data/copy.txt b/tasks/mytarin_es/lab2/data/copy.txt new file mode 100644 index 0000000..665fbc1 --- /dev/null +++ b/tasks/mytarin_es/lab2/data/copy.txt @@ -0,0 +1,3 @@ +6 +6677 +342 \ No newline at end of file diff --git a/tasks/mytarin_es/lab2/data/data.txt b/tasks/mytarin_es/lab2/data/data.txt new file mode 100644 index 0000000..3115917 --- /dev/null +++ b/tasks/mytarin_es/lab2/data/data.txt @@ -0,0 +1,9 @@ +6 +2 +7 +29 +23 +56 +1 +62 +5 \ No newline at end of file diff --git a/tasks/mytarin_es/lab2/docker-compose.yml b/tasks/mytarin_es/lab2/docker-compose.yml new file mode 100644 index 0000000..84b0b75 --- /dev/null +++ b/tasks/mytarin_es/lab2/docker-compose.yml @@ -0,0 +1,18 @@ +version: "3.1" +services: + worker-1: + build: ./worker-1 #сборка образа + volumes: + # Монтирует локальную папку data к папке data в контейнере. + - ./data:/var/data + # Монтирует локальную папку result-1 к папке result в контейнере. + - ./result-1:/var/result + worker-2: + build: ./worker-2 + volumes: + # Монтирует локальную папку result-1 к папке data в контейнере. + - ./result-1:/var/data + - ./result:/var/result + # Зависимость от первого приложения. + depends_on: #зависимости + - worker-1 \ No newline at end of file diff --git a/tasks/mytarin_es/lab2/im1.png b/tasks/mytarin_es/lab2/im1.png new file mode 100644 index 0000000000000000000000000000000000000000..4d922fa5e8292b50f289f9d0ed8ccb42ed8c7898 GIT binary patch literal 23150 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 literal 0 HcmV?d00001 diff --git a/tasks/mytarin_es/lab2/lab2.sln b/tasks/mytarin_es/lab2/lab2.sln new file mode 100644 index 0000000..b015262 --- /dev/null +++ b/tasks/mytarin_es/lab2/lab2.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1\worker-1.csproj", "{585B6726-A235-4057-896C-EDE6731C6AC6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2\worker-2.csproj", "{1CCB3B9E-92BA-413B-825A-34BCE1482729}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {585B6726-A235-4057-896C-EDE6731C6AC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {585B6726-A235-4057-896C-EDE6731C6AC6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {585B6726-A235-4057-896C-EDE6731C6AC6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {585B6726-A235-4057-896C-EDE6731C6AC6}.Release|Any CPU.Build.0 = Release|Any CPU + {1CCB3B9E-92BA-413B-825A-34BCE1482729}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1CCB3B9E-92BA-413B-825A-34BCE1482729}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1CCB3B9E-92BA-413B-825A-34BCE1482729}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1CCB3B9E-92BA-413B-825A-34BCE1482729}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/tasks/mytarin_es/lab2/result-1/data.txt b/tasks/mytarin_es/lab2/result-1/data.txt new file mode 100644 index 0000000..3115917 --- /dev/null +++ b/tasks/mytarin_es/lab2/result-1/data.txt @@ -0,0 +1,9 @@ +6 +2 +7 +29 +23 +56 +1 +62 +5 \ No newline at end of file diff --git a/tasks/mytarin_es/lab2/result/result.txt b/tasks/mytarin_es/lab2/result/result.txt new file mode 100644 index 0000000..64bb6b7 --- /dev/null +++ b/tasks/mytarin_es/lab2/result/result.txt @@ -0,0 +1 @@ +30 diff --git a/tasks/mytarin_es/lab2/worker-1/Dockerfile b/tasks/mytarin_es/lab2/worker-1/Dockerfile new file mode 100644 index 0000000..6cb925a --- /dev/null +++ b/tasks/mytarin_es/lab2/worker-1/Dockerfile @@ -0,0 +1,16 @@ +#задаем базовый образ на .net 7.0 +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env +#задаем рабочую директорию +WORKDIR /src +#в каталог копируем файлы и папки в контейнер +COPY *.csproj . +#создаем образы и устанавливаем данные пакеты в контейнер +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"] \ No newline at end of file diff --git a/tasks/mytarin_es/lab2/worker-1/Program.cs b/tasks/mytarin_es/lab2/worker-1/Program.cs new file mode 100644 index 0000000..b0af691 --- /dev/null +++ b/tasks/mytarin_es/lab2/worker-1/Program.cs @@ -0,0 +1,38 @@ +using System.Text; + +string[] f = Directory.GetFiles("../var/data"); + +string maxPath = ""; + +long maxCapacity = 0; + +foreach (var path in f) +{ + FileInfo info = new FileInfo(path); + + if (info.Length > maxCapacity) + { + maxCapacity = info.Length; + + maxPath = path; + } +} +using (FileStream stream_read = File.OpenRead(maxPath)) +{ + byte[] bufffer_read = new byte[stream_read.Length]; + + await stream_read.ReadAsync(bufffer_read, 0, bufffer_read.Length); + + string text = Encoding.Default.GetString(bufffer_read); + + using (FileStream stream_write = new FileStream("../var/result/data.txt", FileMode.OpenOrCreate)) + { + stream_write.SetLength(0); + + byte[] buffer_write = Encoding.Default.GetBytes(text); + + await stream_write.WriteAsync(buffer_write, 0, buffer_write.Length); + } +} + +Console.WriteLine("Программа 1 завершена"); \ No newline at end of file diff --git a/tasks/mytarin_es/lab2/worker-1/worker-1.csproj b/tasks/mytarin_es/lab2/worker-1/worker-1.csproj new file mode 100644 index 0000000..93ad7da --- /dev/null +++ b/tasks/mytarin_es/lab2/worker-1/worker-1.csproj @@ -0,0 +1,11 @@ + + + + Exe + net7.0 + worker_1 + enable + enable + + + diff --git a/tasks/mytarin_es/lab2/worker-2/Dockerfile b/tasks/mytarin_es/lab2/worker-2/Dockerfile new file mode 100644 index 0000000..6e7c79c --- /dev/null +++ b/tasks/mytarin_es/lab2/worker-2/Dockerfile @@ -0,0 +1,16 @@ +#задаем базовый образ на .net 7.0 +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env +#задаем рабочую директорию +WORKDIR /src +#в каталог копируем файлы и папки в контейнер +COPY *.csproj . +#создаем образы и устанавливаем данные пакеты в контейнер +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"] \ No newline at end of file diff --git a/tasks/mytarin_es/lab2/worker-2/Program.cs b/tasks/mytarin_es/lab2/worker-2/Program.cs new file mode 100644 index 0000000..e01b220 --- /dev/null +++ b/tasks/mytarin_es/lab2/worker-2/Program.cs @@ -0,0 +1,32 @@ +string[] lines = File.ReadAllLines("../var/data/data.txt"); + +int firstNumber = 0; +int lastNumber = 0; + +foreach (string line in lines) +{ + if (int.TryParse(line, out int number)) + { + firstNumber = number; + break; + } +} + +for (int i = lines.Length - 1; i >= 0; i--) +{ + if (int.TryParse(lines[i], out int number)) + { + lastNumber = number; + break; + } +} + +int itog = firstNumber * lastNumber; + +using (StreamWriter writer = new StreamWriter("../var/result/result.txt")) +{ + writer.WriteLine(itog); +} + +Console.WriteLine("Программа 2 завершена"); +Console.WriteLine("Результат: " + itog); \ No newline at end of file diff --git a/tasks/mytarin_es/lab2/worker-2/worker-2.csproj b/tasks/mytarin_es/lab2/worker-2/worker-2.csproj new file mode 100644 index 0000000..b90f9cb --- /dev/null +++ b/tasks/mytarin_es/lab2/worker-2/worker-2.csproj @@ -0,0 +1,11 @@ + + + + Exe + net7.0 + worker_2 + enable + enable + + +