Compare commits

...

21 Commits

Author SHA1 Message Date
82ecad71f4 is ready (ура) 2024-10-01 19:42:31 +04:00
8a96320fd5 Merge pull request 'bazunov_andrew_lab_1' (#33) from bazunov_andrew_lab_1 into main
Reviewed-on: Alexey/DAS_2024_1#33
2024-09-30 22:18:50 +04:00
bd25930973 Merge pull request 'tsukanova_irina_lab_2' (#32) from tsukanova_irina_lab_2 into main
Reviewed-on: Alexey/DAS_2024_1#32
2024-09-30 22:18:28 +04:00
37996c249a Merge pull request 'dolgov_dmitriy_lab_1' (#29) from dolgov_dmitriy_lab_1 into main
Reviewed-on: Alexey/DAS_2024_1#29
2024-09-26 10:25:37 +04:00
9456d4fe01 Merge pull request 'borschevskaya_anna_lab_2 is ready' (#25) from borschevskaya_anna_lab_2 into main
Reviewed-on: Alexey/DAS_2024_1#25
2024-09-26 10:20:55 +04:00
c14e105db5 Merge pull request 'presnyakova_victoria_lab_1' (#24) from presnyakova_victoria_lab_1 into main
Reviewed-on: Alexey/DAS_2024_1#24
2024-09-26 09:59:12 +04:00
4d1e900721 Merge pull request 'yakovleva_yulia_lab_2' (#20) from yakovleva_yulia_lab_2 into main
Reviewed-on: Alexey/DAS_2024_1#20
Reviewed-by: Alexey <a.zhelepov@mail.ru>
2024-09-26 08:45:08 +04:00
7184d6d728 Обновить bazunov_andrew_lab_1/README.md 2024-09-25 15:44:25 +04:00
Bazunov Andrew Igorevich
6e7055efa4 update readme 2024-09-25 15:37:57 +04:00
Bazunov Andrew Igorevich
9e40adc53c edit docker compose 2024-09-25 15:19:28 +04:00
Bazunov Andrew Igorevich
4a36528cc7 Complete docker compose 2024-09-25 12:35:39 +04:00
JulYakJul
21cdd4971d fix link 2024-09-24 14:53:05 +04:00
bdb5cc07ed Обновить dolgov_dmitriy_lab_1/README.md 2024-09-24 01:30:02 +04:00
e761e33201 Обновить dolgov_dmitriy_lab_1/README.md 2024-09-24 01:28:51 +04:00
Аришина)
ceee500b95 ЛР 1 готова 2024-09-24 01:20:27 +04:00
2be2c71b69 перенос 2024-09-23 20:19:10 +04:00
JulYakJul
aa8180ba49 Merge branch 'main' into yakovleva_yulia_lab_2 2024-09-23 17:34:56 +04:00
JulYakJul
ba7480cb4f fix 2024-09-23 13:10:28 +04:00
520337f92d borschevskaya_anna_lab_2 is ready 2024-09-23 08:40:17 +04:00
06d1d8cdd4 lab1 2024-09-22 18:06:51 +04:00
JulYakJul
1adaac9281 yakovleva_yulia_lab_2 is ready 2024-09-20 18:36:39 +04:00
57 changed files with 2403 additions and 0 deletions

2
bazunov_andrew_lab_1/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
ollama
./ollama

View File

@@ -0,0 +1,33 @@
# Распределенные вычисления и приложения Л1
## _Автор Базунов Андрей Игревич ПИбд-42_
В качестве сервисов были выбраны:
- 1.Ollama (_Сервис для использования LLMs моделей_)
- 2.Open Web Ui (_Сервис для удобного общения с моделью из сервиса Ollama_)
- 3.Gitea (_Гит сервис_)
# Docker
>Перед исполнением вполняем установку docker и проверяем версию
```sh
docker-compose --version
```
>Далее производим настройку файла docker-compose.yaml и запускаем контейнер
```sh
docker-compose up -d
```
>Для завершения работы контейнера используем команду
```sh
docker-compose down
```
---
> Замечание: после запуска контейнера, необходимо перейти в контейнер **ollamа** и выполнить установку модели [gemma2](https://ollama.com/library/gemma2:2b)
> ```sh
> docker-compose exec ollama ollama run ollama run gemma2:2b
> ```
---
Далее можно использовать веб сервис Open Web Ui по адресу **localhost:8080** для общения с моделью и Gitea по адресу **localhost:3000** - [демонстрация работы](https://vk.com/video/@viltskaa?z=video236673313_456239574%2Fpl_236673313_-2)

View File

@@ -0,0 +1,61 @@
services:
gitea: # Имя сервиса
image: gitea/gitea:latest # Имя образа
container_name: gitea # Имя контейнера, может быть произовольным
ports:
- "3000:3000" # Проброс порта Gitea на хост
volumes: # хранилище
- data:/data
environment: # переменные окружения
USER_UID: 1000
USER_GID: 1000
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: always
ports:
- 7869:11434
pull_policy: always
tty: true
volumes:
- .:/code
- ./ollama/ollama:/root/.ollama # Директория для данных Ollama
environment:
- OLLAMA_KEEP_ALIVE=24h
- OLLAMA_HOST=0.0.0.0 # Указываем хост для API Ollama
networks:
- ollama-docker
command: ["serve"] # Запускаем Ollama в режиме сервера
ollama-webui:
image: ghcr.io/open-webui/open-webui:main # Образ Open Web UI
container_name: ollama-webui
restart: unless-stopped
volumes:
- ./ollama/ollama-webui:/app/backend/data
ports:
- 8080:8080 # Порт для веб-интерфейса
environment: # https://docs.openwebui.com/getting-started/env-configuration#default_models
- OLLAMA_BASE_URLS=http://host.docker.internal:7869
- ENV=dev
- WEBUI_AUTH=False
- WEBUI_NAME=Viltskaa AI
- WEBUI_URL=http://localhost:8080
- WEBUI_SECRET_KEY=t0p-s3cr3t
depends_on:
- ollama
extra_hosts:
- host.docker.internal:host-gateway
networks:
- ollama-docker
networks:
ollama-docker:
external: false
volumes:
ollama:
driver: local
data:
driver: local

38
borschevskaya_anna_lab_2/.gitignore vendored Normal file
View File

@@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@@ -0,0 +1,43 @@
# Отчет. Лабораторная работа 2
В рамках лабораторной работы №2 были написаны два сервиса, работающих с текстовыми файлами.
Для первого сервиса был выбран вариант задания №5:
```
Ищет в каталоге /var/data файл с самым коротким названием и перекладывает его в /var/result/data.txt.
```
А для второго - №2:
```
Ищет наименьшее число из файла /var/data/data.txt и сохраняет его третью степень в /var/result/result.txt.
```
## Описание
Сначала сервис first перемещает данные из файла с самым коротким названием, находящегося в указанной примонтированной директории, в выходную папку.
Доступ к выходной папке имеет второй сервис, который выводит наименьшее число из помещенного первым сервисом файла
в третьей степени в выходной файл.
Выходной файл расположен в примонтированной директории и доступен на машине, где запускаются сервисы.
В Dockerfile используется многоэтапная сборка с использованием нескольких базовых образов на каждом этапе.
Описание значения каждой строки есть в Dockerfile в сервисе first.
В файле docker-compose.yml приведено описание новых строк, связанных с подключением примонтированных томов.
Стоит отметить, что для "общения" сервисов используется общий том common, который монтируется в контейнер по пути /var/result. Это позволяет сохранять результаты
работы первого сервиса для использования вторым сервисом.
## Как запустить
Для того, чтобы запустить сервисы, необходимо выполнить следующие действия:
1. Установить и запустить Docker Engine или Docker Desktop
2. Через консоль перейти в папку, в которой расположен файл docker-compose.yml
3. Выполнить команду:
```
docker compose up --build
```
В случае успешного запуска всех контейнеров в консоли будет выведено следующее сообщение:
```
✔ Network borschevskaya_anna_lab_2_default Created 0.1s
✔ Container borschevskaya_anna_lab_2-first-1 Created 0.1s
✔ Container borschevskaya_anna_lab_2-second-1 Created 0.1s
Attaching to borschevskaya_anna_lab_2-first-1, borschevskaya_anna_lab_2-second-1
```
Далее, в консоль каждого сервиса будут выведены сообщения о том, как прошла обработка файлов.
В случае отсутствия заданных значений переменных окружения INPUT_PATH и OUTPUT_PATH и
в иных исключительных ситуация будет выведена информация об этом.
## Видео-отчет
Работоспособность лабораторной работы можно оценить в следующем [видео](https://disk.yandex.ru/i/LFxdyRUFQDwXEQ).

View File

@@ -0,0 +1,22 @@
services:
first:
build: ./first # директория, в которой нужно искать Dockerfile для сборки первого сервиса
environment:
INPUT_PATH: /var/data/ # директория с входными данными для обработки файлов
OUTPUT_PATH: /var/result/ # директория с выходными данными обработки
volumes:
- ./volumes/input:/var/data # монтируется локальная папка с входными данными в папку внутри контейнера
- common:/var/result # монтируется общий для двух сервисов том, в который first сложит результаты обработки по варианту
second:
build: ./second # директория, в которой нужно искать Dockerfile для сборки второго сервиса
depends_on: # сервис second зависит от сервиса first и будет запущен после него
- first
environment:
INPUT_PATH: /var/result/
OUTPUT_PATH: /var/data/
volumes:
- ./volumes/output:/var/data
- common:/var/result # монтируется общий для двух сервисов том, из которого second получит результаты обработки first сервиса и выполнит свою логику
volumes:
common:

View File

@@ -0,0 +1,25 @@
# Используем образ Maven для сборки
FROM maven:3.8-eclipse-temurin-21-alpine AS build
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем только pom.xml и загружаем зависимости
# Так зависимости закэшируются в Docker при изменении кода закэшированные слои с зависимостями будут подгружаться быстрее
COPY pom.xml .
RUN mvn dependency:go-offline
# Копируем остальные исходные файлы
COPY src ./src
# Собираем весь проект
RUN mvn clean package -DskipTests
# Используем официальный образ JDK для запуска собранного jar-файла
FROM eclipse-temurin:21-jdk-alpine
# Копируем jar-файл из предыдущего этапа
COPY --from=build /app/target/*.jar /app.jar
# Указываем команду для запуска приложения
CMD ["java", "-jar", "app.jar"]

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.first</groupId>
<artifactId>first</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>ru.first.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,50 @@
package ru.first;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Comparator;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import static java.util.Objects.isNull;
public class Main {
public static final String INPUT_PATH = System.getenv("INPUT_PATH");
public static final String OUTPUT_PATH = System.getenv("OUTPUT_PATH");
public static final String RESULT_FILE_NAME = "data.txt";
public static void main(String[] args) throws IOException {
if (isNull(INPUT_PATH) || INPUT_PATH.isEmpty() || isNull(OUTPUT_PATH) || OUTPUT_PATH.isEmpty()) {
System.out.printf("Отсутствуют переменные окружения INPUT_PATH = '%s' или OUTPUT_PATH = '%s'%n",
INPUT_PATH, OUTPUT_PATH);
return;
}
var inputPathDir = Path.of(INPUT_PATH);
if (!Files.exists(inputPathDir)) {
Files.createDirectory(inputPathDir);
}
var inputDirectory = new File(INPUT_PATH);
var allDirFiles = inputDirectory.listFiles();
if (isNull(allDirFiles) || allDirFiles.length == 0) {
System.out.println("Директория пуста");
return;
}
var dirFiles = Arrays.stream(allDirFiles).filter(File::isFile).toList();
if (dirFiles.isEmpty()) {
System.out.println("В указанной директории нет подходящих для обработки файлов");
return;
}
var shortestName = dirFiles.stream().min(Comparator.comparing(file -> file.getName().length())).get();
var outputPathDir = Path.of(OUTPUT_PATH);
if (!Files.exists(outputPathDir)) {
Files.createDirectory(outputPathDir);
}
var resultFilePath = Path.of(OUTPUT_PATH + File.separator + RESULT_FILE_NAME);
Files.move(Path.of(INPUT_PATH + File.separator + shortestName.getName()), resultFilePath, REPLACE_EXISTING);
}
}

View File

@@ -0,0 +1,16 @@
FROM maven:3.8-eclipse-temurin-21-alpine AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests
FROM eclipse-temurin:21-jdk-alpine
COPY --from=build /app/target/*.jar /app.jar
CMD ["java", "-jar", "app.jar"]

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.second</groupId>
<artifactId>second</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>ru.second.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,51 @@
package ru.second;
import java.io.File;
import java.io.FileWriter;
import java.nio.file.Files;
import static java.util.Objects.isNull;
public class Main {
public static final String INPUT_PATH = System.getenv("INPUT_PATH");
public static final String INPUT_FILE_NAME = "data.txt";
public static final String OUTPUT_PATH = System.getenv("OUTPUT_PATH");
public static final String RESULT_FILE_NAME = "result.txt";
public static void main(String[] args) {
if (isNull(INPUT_PATH) || INPUT_PATH.isEmpty() || isNull(OUTPUT_PATH) || OUTPUT_PATH.isEmpty()) {
System.out.printf("Отсутствуют переменные окружения INPUT_PATH = '%s' или OUTPUT_PATH = '%s'%n",
INPUT_PATH, OUTPUT_PATH);
return;
}
var inputFile = new File(INPUT_PATH + File.separator + INPUT_FILE_NAME);
if (!inputFile.exists()) {
System.out.println("Входной файл не существует");
return;
}
try (var stream = Files.lines(inputFile.toPath());
var writer = new FileWriter(OUTPUT_PATH + File.separator + RESULT_FILE_NAME);
) {
var min = stream.map(Main::parseInt).reduce(Integer::min);
if (min.isEmpty()) {
System.out.println("Не найдено минимальное значение среди строк файла");
return;
}
var minValue = Math.pow(min.get(), 3);
System.out.printf("Get min value = '%d'%n", min.get());
writer.append(Double.toString(minValue));
System.out.printf("To file %s was written value %f%n", RESULT_FILE_NAME, minValue);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
private static Integer parseInt(String line) {
line = line.replace("\\n", "");
return Integer.parseInt(line);
}
}

4
dolgov_dmitriy_lab_1/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
data/
log/
wordpress/
custom/

View File

@@ -0,0 +1,34 @@
# Лабораторная работа №1
## Выполнил: Долгов Дмитрий, группа ПИбд-42
### Были развёрнуты следующие сервисы:
* mediawiki (движок вики)
* wordpress (популярная система управления контентом)
* gitea (сервис для хранения репозиториев git)
* mariaDB
### Были использованы следующие технологии:
* git
* docker
* docker-compose
### Для запуска лабораторной работы необходимо ввести в консоль следующую команду:
```
docker compose up -d
```
## Результат запуска:
```
[+] Running 4/4
✔ Container dolgov_dmitriy_lab_1-wordpress-1 Running 0.0s
✔ Container dolgov_dmitriy_lab_1-database-1 Running 0.0s
✔ Container dolgov_dmitriy_lab_1-mediawiki-1 Running 0.0s
✔ Container gitea Running
```
## Видео с результатом запуска:
Видео можно посмотреть по данной [ссылке](https://drive.google.com/file/d/1hC6HhNvYBRuYVClobXyDMReA4ngwxhwc/view?usp=drive_link).

View File

@@ -0,0 +1,73 @@
# Сервисы по заданию
services:
# Сервис MediaWiki
mediawiki:
# Образ MediaWiki
image: mediawiki
# Автоматический перезапуск при сбое
restart: always
# проброс порта 80 из контейнера на порт 8080 хоста
ports:
- "8080:80"
# связь с сервисом database
links:
- database
# монтирование volume для хранения данных
volumes:
- images:/var/www/html/images
# Сервис WordPress
wordpress:
# Образ WordPress
image: wordpress:latest
# Автоматический перезапуск при сбое
ports:
- "8082:80"
restart: always
volumes:
- ./wordpress:/var/www/html
# Сервис Gitea
server:
image: gitea/gitea:latest
container_name: gitea
restart: always
environment:
- USER_UID=1000
- USER_GID=1000
volumes:
- ./data:/data
- ./custom:/app/gitea/custom
- ./log:/app/gitea/log
ports:
- "8081:3000"
links:
- database
depends_on:
- database
# Сервис MariaDB
database:
# Образ MariaDB
image: mariadb
# Автоматический перезапуск при сбое
restart: always
# переменные окружения для настройки базы данных
environment:
# имя базы данных
MYSQL_DATABASE: my_wiki
# имя пользователя
MYSQL_USER: user
# пароль пользователя
MYSQL_PASSWORD: user
# случайный пароль для пользователя root
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
# монтирование volume для хранения данных
volumes:
- db:/var/lib/mysql
# тома для хранения данных
volumes:
images:
db:

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

View File

@@ -0,0 +1,29 @@
services:
rabbitmq:
image: rabbitmq:3.12.8-management
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin
ports:
- 15672:15672
volumes:
- rabbitmq-data:/var/lib/rabbitmq
mediawiki:
image: mediawiki
ports:
- 8081:80
volumes:
- mediawiki-data:/var/files/mediawiki
wordpress:
image: wordpress
ports:
- 8082:80
volumes:
- wordpress-data:/var/files/wordpress
volumes:
rabbitmq-data:
mediawiki-data:
wordpress-data:

View File

@@ -0,0 +1,26 @@
# Docker Compose: RabbitMQ, Mediawiki, Wordpress
## Описание проекта
Этот проект разворачивает три сервиса с помощью Docker Compose:
1. **RabbitMQ** — брокер сообщений.
2. **Mediawiki** — движок вики.
3. **Wordpress** — популярная система управления контентом.
## Команды для запуска
Из директории с файлом docker-compose.yml запустить сервисы docker-compose up --build
## Сервисы и порты
1. **RabbitMQ:**
Доступ по адресу http://localhost:15672/ (логин: admin, пароль: admin).
2. **Mediawiki:**
Доступ по адресу http://localhost:8081/.
3. **Wordpress:**
Доступ по адресу http://localhost:8082/.
## Видео https://drive.google.com/file/d/1NvsMFoMU2ecsQ17EouqB_ZaLBskonHv0/view?usp=sharing

View File

@@ -0,0 +1,4 @@
DB_HOST = db
DB_USER = wordpress
DB_PASSWORD = wordpress
DB_NAME = wordpress

View File

@@ -0,0 +1,3 @@
result/
data/
.vscode/

View File

@@ -0,0 +1,43 @@
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
## Задание
* Разработать два приложения такие, что результат первого является исходными данными для второго.
* Собрать файл ```docker-compose.yml``` для запуска приложений.
Изучить файлы сборки образов ```docker``` и разработать их для созданных приложений и правильно закоммитить решение
### Варианты задания:
&nbsp;1. ```app_one``` - Ищет в каталоге ```/var/data``` файл с наибольшим количеством строк и перекладывает его в ```/var/result/data.txt.```
&nbsp;2. ```app_two``` - Ищет наименьшее число из файла ```/var/data/data.txt``` и сохраняет его третью степень в ```/var/result/result.txt.```
## Запуск
## Запуск работы
1. Убедиться, что установлены необходимые технологии:
- Docker: Платформа для контейнеризации приложений.
- Docker Compose: Инструмент для запуска многоконтейнерных приложений на основе `docker-compose.yaml`. Обычно поставляется вместе с Docker. Чтобы проверить, установлена ли утилита, нужно запустить команду:
```bash
docker-compose --version
```
2. В директории, где находится файл `docker-compose.yaml`, выполнить следующую команду для запуска всех сервисов:
```bash
docker-compose up --build
```
Эта команда сначала выполнит сборку, а затем запустит контейнеры.
3. После успешного запуска можно перейти в каталог проекта и увидеть папку data со сгенерированными файлами и папку result, в которой два текстовых файла:
- data.txt - файл, полученный после выполнения первой программы.
- result.txt -файл, полученный после выполнения второй программы.
## Описание работы:
Для разработки приложений был выбран язык программирования - ```python```
Построчное описание docker-compose.yaml и других файлов выполнено в самих файлах.
# Вк видео
https://vk.com/video256017065_456239871?list=ln-0dkZ8lxZS2VXpSR3TP

View File

@@ -0,0 +1,11 @@
# Официальный образ Python 3.10
FROM python:3.10-slim
# Установка рабочей директории
WORKDIR /app
# Копирование всех (в данном случае одного) файлов в контейнер
COPY First.py /app/
# Запуск программы
CMD ["python", "First.py"]

View File

@@ -0,0 +1,31 @@
import os
import shutil
# Пути к директориии для поиска и файла для сохранения
source_dir = '/var/data'
destination_file = '/var/result/data.txt'
# Простая функция дл подсчёта строк в файле. Настроили для работы с кириллицей (utf-8)
def count_lines(filepath):
with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
return sum(1 for _ in f)
# Старт поиска файла по условию (самое большое кол-во строк)
max_lines = 0
max_file = None
for filename in os.listdir(source_dir):
file_path = os.path.join(source_dir, filename)
if os.path.isfile(file_path):
lines = count_lines(file_path)
if lines > max_lines:
max_lines = lines
max_file = file_path
# Копирование файла с самым большим кол-вом строчек в нужную директорию
if max_file:
shutil.copy(max_file, destination_file)
print(f"{max_file} с кол-вом строк {max_lines} был перемещен в {destination_file}")
else:
print("Указанная директория пустая :(")

View File

@@ -0,0 +1,11 @@
# Официальный образ Python 3.10
FROM python:3.10-slim
# Установка рабочей директории
WORKDIR /app
# Копирование всех (в данном случае одного) файлов в контейнер
COPY Second.py /app/
# Запуск программы
CMD ["python", "Second.py"]

View File

@@ -0,0 +1,18 @@
# Пути к директориии c файлами для поиска и сохранения
input_file = '/var/result/data.txt'
output_file = '/var/result/result.txt'
# Поиск наименьшего числа в файле
with open(input_file, 'r') as f:
numbers = [float(line.strip()) for line in f if line.strip()]
# Искомое min число
min_number = min(numbers)
cubed_number = min_number ** 3
# Сохранение
with open(output_file, 'w') as f:
f.write(str(cubed_number))
print(f"Наименьшее число: {min_number}\nЕго третья степень: {cubed_number}\nРезультат сохранён в {output_file}")

View File

@@ -0,0 +1,8 @@
278
940
336
99
360
451
836
359

View File

@@ -0,0 +1,72 @@
240
468
64
586
648
230
203
295
979
621
528
718
107
822
323
691
446
667
994
645
985
604
664
465
541
747
163
329
993
374
968
512
739
774
928
433
560
610
336
194
572
735
775
617
712
412
324
40
837
15
100
28
682
498
628
832
889
964
941
167
777
400
413
361
326
796
68
154
355
866
161
76

View File

@@ -0,0 +1,75 @@
116
224
318
215
419
465
431
319
838
430
366
906
166
69
576
173
879
177
43
586
34
990
794
474
961
980
771
170
262
294
294
718
802
745
464
411
626
702
809
917
580
368
101
674
564
335
581
437
907
546
545
545
237
205
263
503
759
199
915
835
765
784
562
834
921
784
242
547
988
477
823
640
440
475
151

View File

@@ -0,0 +1,97 @@
157
634
716
273
113
861
144
182
379
619
766
375
857
836
380
752
328
460
560
369
900
258
78
847
275
802
903
892
211
294
68
590
193
913
164
855
583
983
696
330
327
798
442
669
211
677
225
633
784
961
246
683
184
247
315
9
876
260
743
200
813
578
465
429
738
783
695
206
658
701
612
689
66
971
334
371
638
549
720
497
569
945
701
415
200
422
977
931
854
638
583
870
938
53
349
572
414

View File

@@ -0,0 +1,83 @@
830
7
232
405
514
173
739
974
156
469
232
226
988
957
272
491
721
703
751
797
379
866
119
697
846
634
840
483
660
258
48
399
807
344
370
373
304
520
464
80
258
57
172
343
693
342
893
702
794
313
767
466
966
433
842
845
836
676
560
398
442
531
548
896
488
573
662
427
840
962
460
108
146
862
651
559
755
536
14
702
709
379
231

View File

@@ -0,0 +1,95 @@
278
58
817
997
915
183
750
625
302
228
819
357
797
672
990
207
477
872
40
792
45
405
669
375
137
807
876
84
726
813
629
301
331
143
598
429
827
173
850
548
19
907
185
392
257
349
480
314
510
239
420
994
880
492
366
540
96
283
331
604
38
93
844
197
780
159
338
932
661
936
573
602
319
512
472
419
374
144
872
76
634
535
365
247
169
5
934
483
252
807
533
387
323
791
701

View File

@@ -0,0 +1,37 @@
149
821
575
117
846
682
74
706
415
736
910
392
31
210
425
565
645
396
774
16
882
260
668
997
94
286
170
506
494
634
635
319
943
885
555
662
727

View File

@@ -0,0 +1,72 @@
91
433
212
692
903
322
360
926
952
428
142
775
939
979
241
298
697
951
688
613
801
653
543
815
356
170
25
620
57
102
483
317
982
531
15
286
948
494
102
537
871
741
412
135
543
228
158
9
852
432
598
997
367
139
783
475
73
761
466
520
605
444
353
473
8
925
977
634
769
905
115
213

View File

@@ -0,0 +1,65 @@
764
559
169
642
513
341
376
904
912
313
522
226
467
172
952
315
359
612
695
487
564
697
681
31
186
222
212
631
177
46
443
252
262
662
480
750
560
148
342
119
659
82
846
84
726
182
286
648
252
826
848
351
98
619
630
503
507
527
662
961
403
752
756
938
16

View File

@@ -0,0 +1,65 @@
498
783
418
943
427
460
545
38
892
345
552
605
591
958
903
927
38
950
774
596
314
177
499
706
440
943
451
13
306
126
831
311
834
304
186
265
456
21
320
746
570
708
172
702
320
532
491
334
757
505
83
167
312
511
723
92
885
904
608
542
579
679
615
993
60

View File

@@ -0,0 +1,27 @@
services:
# Сервис файлового генератора
generator:
build:
context: ./file_generator # Путь к директории с Dockerfile
volumes:
- ./data:/var/data # Монтирование локальной папки data в /var/data, то есть в контейнере
# Сервис первой программы
app_one:
depends_on: # повесили ожидание запуска генератора файлов
- generator
build:
context: ./app_one/ # Путь к директории с Dockerfile
volumes:
- ./data:/var/data
- ./result:/var/result
# Сервис второй программы
app_two:
depends_on: # повесили ожидание запуска первой программы
- app_one
build:
context: ./app_two/ # Путь к директории с Dockerfile
volumes:
- ./data:/var/data
- ./result:/var/result

View File

@@ -0,0 +1,11 @@
# Официальный образ Python 3.10
FROM python:3.10-slim
# Установка рабочей директории
WORKDIR /app
# Копирование всех (в данном случае одного) файлов в контейнер
COPY Generator.py /app/
# Запуск программы
CMD ["python", "Generator.py"]

View File

@@ -0,0 +1,31 @@
import os
import random
# Директория для генерации файлов
output_dir = '/var/data'
# Проверка на наличие таковой
os.makedirs(output_dir, exist_ok=True)
# Генерируем случайное кол-во файлов (1-15)
num_files = random.randint(1, 15)
# Случайное по всем статьям заполнение файла
def generate_random_file(filename):
# Рандомное кол-во строк в файле
num_lines = random.randint(1, 100)
with open(filename, 'w') as f:
for _ in range(num_lines):
# Для полного швепса выбираем случайное число
random_number = random.randint(0, 1000)
f.write(f"{random_number}\n")
# Запускаем генерацию нашего набора файлов
for i in range(num_files):
filename = os.path.join(output_dir, f'random_file_{i + 1}.txt')
generate_random_file(filename)
print(f"Генерация файла {filename}.")
print(f"Общее кол-во сгенерированных файлов: {num_files}")

View File

@@ -0,0 +1,97 @@
157
634
716
273
113
861
144
182
379
619
766
375
857
836
380
752
328
460
560
369
900
258
78
847
275
802
903
892
211
294
68
590
193
913
164
855
583
983
696
330
327
798
442
669
211
677
225
633
784
961
246
683
184
247
315
9
876
260
743
200
813
578
465
429
738
783
695
206
658
701
612
689
66
971
334
371
638
549
720
497
569
945
701
415
200
422
977
931
854
638
583
870
938
53
349
572
414

View File

@@ -0,0 +1 @@
729.0

View File

@@ -0,0 +1,30 @@
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md
!**/.gitignore
!.git/HEAD
!.git/config
!.git/packed-refs
!.git/refs/heads/**

484
yakovleva_yulia_lab_2/.gitignore vendored Normal file
View File

@@ -0,0 +1,484 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from `dotnet new gitignore`
# dotenv files
.env
# 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
.idea
##
## 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
# Vim temporary swap files
*.swp

View File

@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.6" />
</ItemGroup>
<!-- <ItemGroup>
<ProjectReference Include="..\FileGeneration\FileGeneration.csproj" />
</ItemGroup> -->
</Project>

View File

@@ -0,0 +1,20 @@
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["App1.csproj", "App1/"]
RUN dotnet restore "App1/App1.csproj"
WORKDIR "/src/App1"
COPY . .
RUN dotnet build "App1.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "App1.csproj" -c $BUILD_CONFIGURATION -o /app/publish --self-contained false --no-restore
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "App1.dll"]

View File

@@ -0,0 +1,31 @@
using System;
using System.IO;
class Program
{
static void Main()
{
string inputPath = Environment.GetEnvironmentVariable("DATA_PATH") ?? ".\\data";
string outputPath = Environment.GetEnvironmentVariable("RESULT_PATH") ?? ".\\result";
try
{
string[] files = Directory.GetFiles(inputPath);
using (StreamWriter writer = new StreamWriter(Path.Combine(outputPath, "data.txt")))
{
foreach (string file in files)
{
int lineCount = File.ReadAllLines(file).Length;
writer.WriteLine(lineCount);
}
}
Console.WriteLine("Файл data.txt успешно создан");
}
catch (Exception ex)
{
Console.WriteLine("Произошла ошибка: " + ex.Message);
}
}
}

View File

@@ -0,0 +1,10 @@
{
"profiles": {
"App1": {
"commandName": "Project"
},
"Container (Dockerfile)": {
"commandName": "Docker"
}
}
}

View File

@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.6" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,20 @@
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["App2.csproj", "App2/"]
RUN dotnet restore "App2/App2.csproj"
WORKDIR "/src/App2"
COPY . .
RUN dotnet build "App2.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "App2.csproj" -c $BUILD_CONFIGURATION -o /app/publish --self-contained false --no-restore
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "App2.dll"]

View File

@@ -0,0 +1,35 @@
using System;
using System.IO;
using System.Linq;
class Program
{
static void Main()
{
string inputPath = Environment.GetEnvironmentVariable("DATA_PATH") ?? ".\\data";
string outputPath = Environment.GetEnvironmentVariable("RESULT_PATH") ?? ".\\result";
try
{
string dataFilePath = Path.Combine(inputPath, "data.txt");
// Чтение всех строк из файла
string[] lines = File.ReadAllLines(dataFilePath);
int[] numbers = lines.Select(int.Parse).ToArray();
// Поиск наибольшего числа
int maxNumber = numbers.Max();
// Подсчет количества таких чисел
int maxCount = numbers.Count(n => n == maxNumber);
File.WriteAllText(Path.Combine(outputPath, "result.txt"), maxCount.ToString());
Console.WriteLine($"Количество наибольших чисел: {maxCount}");
}
catch (Exception ex)
{
Console.WriteLine("Произошла ошибка: " + ex.Message);
}
}
}

View File

@@ -0,0 +1,10 @@
{
"profiles": {
"App2": {
"commandName": "Project"
},
"Container (Dockerfile)": {
"commandName": "Docker"
}
}
}

View File

@@ -0,0 +1,37 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34728.123
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App2", "App2\App2.csproj", "{D03073B1-0CB3-4CA9-A9D8-F1FB804F92D1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App1", "App1\App1.csproj", "{729837A1-27A7-4D48-BBB2-21F68E5F7766}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileGeneration", "FileGeneration\FileGeneration.csproj", "{E7AD8A8C-C957-41FF-B92A-924465D73DDB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D03073B1-0CB3-4CA9-A9D8-F1FB804F92D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D03073B1-0CB3-4CA9-A9D8-F1FB804F92D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D03073B1-0CB3-4CA9-A9D8-F1FB804F92D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D03073B1-0CB3-4CA9-A9D8-F1FB804F92D1}.Release|Any CPU.Build.0 = Release|Any CPU
{729837A1-27A7-4D48-BBB2-21F68E5F7766}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{729837A1-27A7-4D48-BBB2-21F68E5F7766}.Debug|Any CPU.Build.0 = Debug|Any CPU
{729837A1-27A7-4D48-BBB2-21F68E5F7766}.Release|Any CPU.ActiveCfg = Release|Any CPU
{729837A1-27A7-4D48-BBB2-21F68E5F7766}.Release|Any CPU.Build.0 = Release|Any CPU
{E7AD8A8C-C957-41FF-B92A-924465D73DDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E7AD8A8C-C957-41FF-B92A-924465D73DDB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E7AD8A8C-C957-41FF-B92A-924465D73DDB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E7AD8A8C-C957-41FF-B92A-924465D73DDB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {36392E9A-B3A7-4CFF-B577-B2A3146B3007}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,22 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["FileGeneration.csproj", "FileGeneration/"]
RUN dotnet restore "FileGeneration/FileGeneration.csproj"
WORKDIR "/src/FileGeneration"
COPY . .
RUN dotnet build "FileGeneration.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "FileGeneration.csproj" -c $BUILD_CONFIGURATION -o /app/publish --self-contained false --no-restore
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "FileGeneration.dll"]

View File

@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.6" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,41 @@
using System;
using System.IO;
class Program
{
static void Main()
{
string directoryPath = Environment.GetEnvironmentVariable("DATA_PATH") ?? ".\\data";
Random random = new Random();
try
{
if (!Directory.Exists(directoryPath))
{
Directory.CreateDirectory(directoryPath);
}
for (int i = 1; i <= 100; i++)
{
int lineCount = random.Next(1, 101);
string filePath = Path.Combine(directoryPath, $"file_{i}.txt");
using (StreamWriter writer = new StreamWriter(filePath))
{
for (int j = 0; j < lineCount; j++)
{
writer.WriteLine($"{j + 1}");
}
}
Console.WriteLine($"Файл {filePath} успешно создан с {lineCount} строками.");
}
}
catch (Exception ex)
{
Console.WriteLine("Произошла ошибка: " + ex.Message);
}
}
}

View File

@@ -0,0 +1,10 @@
{
"profiles": {
"FileGeneration": {
"commandName": "Project"
},
"Container (Dockerfile)": {
"commandName": "Docker"
}
}
}

View File

@@ -0,0 +1,34 @@
# Лабораторная работа 2
## Описание
В данной лабораторной работе были изучены файлы сборки образов и создание их для приложений. Сборки образов необходимы для контейниризации созданных приложений. В файле сборки мы указываем папку из которой копируем в контейнер и собираем проект.
## Описание работы
Были выбраны варианты для первого приложения - 3 вариант и для второго 3 вариант.
В первом приложении мы ищем все файлы из папки output и записываем количество строк каждого файла в файл data.txt. Затем второе приложение ищет в data.txt наибольшее значения и записывает количество наибольших значений в файл result.txt.
## Запуск
1. Для начала необходимо запустить Docker
2. Открыть консоль, перейти в папку с docker-compose.yml
3. Ввести команду:
```
docker compose up --build
```
`--build` необходим для принудительной сборки контейнеров, даже если они уже запущены.
## Результат
В результате в логах видим, что приложения успешно отработали:
```
app2-1 | Количество наибольших чисел: 1
app1-1 exited with code 0
app2-1 exited with code 0
```
И также видим в папке Files две созданные папки: data и result. В data находятся сгенерированные файлы, а в result - файл с результатом.
## Описание docker-compose.yml
В docker-compose.yml запускаются 3 сервиса: первый генерирует файлы с рандомным набором строк, второй сервис записывает количество строк каждого файла в data.txt, а третий сервис определяет количество наибольших чисел из файла data.txt и записывает результат в файл result.txt. Также используются зависимости `depends_on`, второй сервис зависит от запуска первого, и третий севрис зависит от запуска второго.
С помощью `volumes` создаем буферную область, которая позволяет использовать двум севрисам одну папку. `build` позволяет использовать только что собранный образ в момент запуска.
## Видеоотчёт
[Видеоотчёт](https://disk.yandex.ru/i/Ds2f4xO8vQ8XPA)

View File

@@ -0,0 +1,33 @@
services:
generatefiles:
build: ./FileGeneration/
volumes:
- ./Files/data:/var/data
- buffer:/var/result
environment:
DATA_PATH: "/var/data"
RESULT_PATH: "/var/result"
app1:
build: ./App1/
depends_on:
- generatefiles
volumes:
- ./Files/data:/var/data
- buffer:/var/result
environment:
DATA_PATH: "/var/data"
RESULT_PATH: "/var/result"
app2:
build: ./App2/
depends_on:
- app1
volumes:
- buffer:/var/data
- ./Files/result:/var/result
environment:
DATA_PATH: "/var/data"
RESULT_PATH: "/var/result"
volumes:
buffer: