From 0eec58a347800a53eb369d0c3b8d65811215c8da Mon Sep 17 00:00:00 2001 From: Emalyanov535 Date: Tue, 17 Sep 2024 22:07:57 +0400 Subject: [PATCH 1/7] feature: completed lab 2 --- emelyanov_artem_lab_2/README.md | 0 emelyanov_artem_lab_2/app_1/.gitignore | 31 ++++++++++ emelyanov_artem_lab_2/app_1/.idea/.gitignore | 8 +++ emelyanov_artem_lab_2/app_1/Dockerfile | 17 ++++++ emelyanov_artem_lab_2/app_1/src/Main.java | 64 ++++++++++++++++++++ emelyanov_artem_lab_2/app_2/.gitignore | 30 +++++++++ emelyanov_artem_lab_2/app_2/.idea/.gitignore | 10 +++ emelyanov_artem_lab_2/app_2/Dockerfile | 17 ++++++ emelyanov_artem_lab_2/app_2/src/Main.java | 46 ++++++++++++++ emelyanov_artem_lab_2/data/1.txt | 10 +++ emelyanov_artem_lab_2/data/2.txt | 12 ++++ emelyanov_artem_lab_2/data/3.txt | 9 +++ emelyanov_artem_lab_2/docker-compose.yml | 21 +++++++ 13 files changed, 275 insertions(+) create mode 100644 emelyanov_artem_lab_2/README.md create mode 100644 emelyanov_artem_lab_2/app_1/.gitignore create mode 100644 emelyanov_artem_lab_2/app_1/.idea/.gitignore create mode 100644 emelyanov_artem_lab_2/app_1/Dockerfile create mode 100644 emelyanov_artem_lab_2/app_1/src/Main.java create mode 100644 emelyanov_artem_lab_2/app_2/.gitignore create mode 100644 emelyanov_artem_lab_2/app_2/.idea/.gitignore create mode 100644 emelyanov_artem_lab_2/app_2/Dockerfile create mode 100644 emelyanov_artem_lab_2/app_2/src/Main.java create mode 100644 emelyanov_artem_lab_2/data/1.txt create mode 100644 emelyanov_artem_lab_2/data/2.txt create mode 100644 emelyanov_artem_lab_2/data/3.txt create mode 100644 emelyanov_artem_lab_2/docker-compose.yml diff --git a/emelyanov_artem_lab_2/README.md b/emelyanov_artem_lab_2/README.md new file mode 100644 index 0000000..e69de29 diff --git a/emelyanov_artem_lab_2/app_1/.gitignore b/emelyanov_artem_lab_2/app_1/.gitignore new file mode 100644 index 0000000..4291186 --- /dev/null +++ b/emelyanov_artem_lab_2/app_1/.gitignore @@ -0,0 +1,31 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store +/.idea/modules.xml +/.idea/vcs.xml diff --git a/emelyanov_artem_lab_2/app_1/.idea/.gitignore b/emelyanov_artem_lab_2/app_1/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/emelyanov_artem_lab_2/app_1/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/emelyanov_artem_lab_2/app_1/Dockerfile b/emelyanov_artem_lab_2/app_1/Dockerfile new file mode 100644 index 0000000..3e87ad7 --- /dev/null +++ b/emelyanov_artem_lab_2/app_1/Dockerfile @@ -0,0 +1,17 @@ +# Используем базовый образ с установленной JDK +FROM openjdk:17-jdk-slim + +# Создаем директорию для исходных файлов +RUN mkdir /var/data + +# Создаем директорию для приложения +WORKDIR /app + +#Копируем исходные файлы приложения внутрь контейнера +COPY src /app/src + +#Компилируем код +RUN javac /app/src/Main.java + +# Определяем команду для запуска приложения +CMD ["java", "-cp", "/app/src", "Main"] \ No newline at end of file diff --git a/emelyanov_artem_lab_2/app_1/src/Main.java b/emelyanov_artem_lab_2/app_1/src/Main.java new file mode 100644 index 0000000..e071e91 --- /dev/null +++ b/emelyanov_artem_lab_2/app_1/src/Main.java @@ -0,0 +1,64 @@ +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +public class Main { + + public static void main(String[] args) { + + /* + Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt. + */ + + File sourceDir = new File("/var/data"); + File targetFile = new File("/var/result/data.txt"); + + // Проверяем, что sourceDir существует и является директорией + if (!sourceDir.exists() || !sourceDir.isDirectory()) { + System.out.println("Каталог " + sourceDir + " не существует или не является директорией."); + return; + } + + File[] files = sourceDir.listFiles(); + if (files == null || files.length == 0) { + System.out.println("Каталог " + sourceDir + " пуст."); + return; + } + + long maxFileSize = -1L; + File maxFile = null; + + // Находим файл с максимальным размером + for (File item : files) { + if (item.isFile() && item.length() > maxFileSize) { + maxFileSize = item.length(); + maxFile = item; + } + } + + if (maxFile != null) { + // Проверяем, существует ли конечная директория, если нет — создаем её + File targetDir = targetFile.getParentFile(); + if (!targetDir.exists()) { + boolean dirCreated = targetDir.mkdirs(); + if (dirCreated) { + System.out.println("Директория " + targetDir + " была успешно создана."); + } else { + System.out.println("Не удалось создать директорию " + targetDir); + return; + } + } + + try { + // Копируем файл + Files.copy(maxFile.toPath(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + System.out.println("Самый большой файл: " + maxFile.getName() + " был скопирован в /var/result/data.txt"); + } catch (IOException e) { + System.out.println("Ошибка копирования файла: " + e.getMessage()); + } + } else { + System.out.println("Файлы для копирования не найдены."); + } + } +} \ No newline at end of file diff --git a/emelyanov_artem_lab_2/app_2/.gitignore b/emelyanov_artem_lab_2/app_2/.gitignore new file mode 100644 index 0000000..1c5e2ec --- /dev/null +++ b/emelyanov_artem_lab_2/app_2/.gitignore @@ -0,0 +1,30 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store +/.idea/misc.xml diff --git a/emelyanov_artem_lab_2/app_2/.idea/.gitignore b/emelyanov_artem_lab_2/app_2/.idea/.gitignore new file mode 100644 index 0000000..7c5452a --- /dev/null +++ b/emelyanov_artem_lab_2/app_2/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +/modules.xml +/vcs.xml diff --git a/emelyanov_artem_lab_2/app_2/Dockerfile b/emelyanov_artem_lab_2/app_2/Dockerfile new file mode 100644 index 0000000..69b918c --- /dev/null +++ b/emelyanov_artem_lab_2/app_2/Dockerfile @@ -0,0 +1,17 @@ +# Используем базовый образ с установленной JDK +FROM openjdk:17-jdk-slim + +# Создаем директорию для исходных файлов +RUN mkdir /var/data + +# Создаем директорию для приложения +WORKDIR /app + +#Копируем исходные файлы приложения внутрь контейнера +COPY src /app/src + +#Компилируем код +RUN javac /app/src/Main.java + +# Определяем команду для запуска приложения +CMD ["java", "-cp", "/app/src", "Main"] diff --git a/emelyanov_artem_lab_2/app_2/src/Main.java b/emelyanov_artem_lab_2/app_2/src/Main.java new file mode 100644 index 0000000..2d7b837 --- /dev/null +++ b/emelyanov_artem_lab_2/app_2/src/Main.java @@ -0,0 +1,46 @@ +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.util.Scanner; + +public class Main { + + // Сохраняет произведение первого и последнего числа из файла /var/result/data.txt в /var/result/result.txt. + public static void main(String[] args) { + + File sourceFile = new File("/var/result/data.txt"); + File targetFile = new File("/var/result/result.txt"); + + int firstNumber = 0; + int lastNumber = 0; + boolean isFirstNumber = true; + + try (Scanner scanner = new Scanner(sourceFile)) { + // Считываем числа + while (scanner.hasNextInt()) { + int currentNumber = scanner.nextInt(); + + if (isFirstNumber) { + firstNumber = currentNumber; // Сохраняем первое число + isFirstNumber = false; + } + + lastNumber = currentNumber; // Последнее число обновляется на каждом шаге + } + } catch (FileNotFoundException ex) { + System.out.println("Файл не найден: " + ex.getMessage()); + return; // Выходим, если файл не найден + } + + // Рассчитываем произведение первого и последнего числа + int result = firstNumber * lastNumber; + + // Сохраняем результат в файл + try (PrintWriter writer = new PrintWriter(targetFile)) { + writer.println(result); + System.out.println("Произведение первого и последнего числа: " + result); + } catch (FileNotFoundException ex) { + System.out.println("Ошибка записи в файл: " + ex.getMessage()); + } + } +} diff --git a/emelyanov_artem_lab_2/data/1.txt b/emelyanov_artem_lab_2/data/1.txt new file mode 100644 index 0000000..2988c8b --- /dev/null +++ b/emelyanov_artem_lab_2/data/1.txt @@ -0,0 +1,10 @@ +2 +32 +1 +2 +3 +54 +64 +4 +3 +3 \ No newline at end of file diff --git a/emelyanov_artem_lab_2/data/2.txt b/emelyanov_artem_lab_2/data/2.txt new file mode 100644 index 0000000..4eb4b6f --- /dev/null +++ b/emelyanov_artem_lab_2/data/2.txt @@ -0,0 +1,12 @@ +12 +4 +12 +3 +21 +3 +12 +1 +3 +32 +2 +5 \ No newline at end of file diff --git a/emelyanov_artem_lab_2/data/3.txt b/emelyanov_artem_lab_2/data/3.txt new file mode 100644 index 0000000..36ee730 --- /dev/null +++ b/emelyanov_artem_lab_2/data/3.txt @@ -0,0 +1,9 @@ +12 +2 +1 +2 +4 +3 +1 +2 +3 \ No newline at end of file diff --git a/emelyanov_artem_lab_2/docker-compose.yml b/emelyanov_artem_lab_2/docker-compose.yml new file mode 100644 index 0000000..0ed51ed --- /dev/null +++ b/emelyanov_artem_lab_2/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3' +services: + file-finder: + build: + context: ./app_1 # Путь к первому приложению + dockerfile: Dockerfile + volumes: + - C:/Users/Admin/Desktop/УлГТУ/Распределенные вычисления и приложения/DAS_2024_1/emelyanov_artem_lab_2/data:/var/data # Монтируем директорию с файлами + - shared-result:/var/result + + number-processor: + build: + context: ./app_2 # Путь ко второму приложению + dockerfile: Dockerfile + depends_on: + - file-finder + volumes: + - shared-result:/var/result + +volumes: + shared-result: # Объявляем общий том From 0590f7b532dccf5b48ab2aa632f48d5964560db2 Mon Sep 17 00:00:00 2001 From: Emalyanov535 Date: Tue, 17 Sep 2024 22:26:19 +0400 Subject: [PATCH 2/7] feature: add README.md --- emelyanov_artem_lab_2/README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/emelyanov_artem_lab_2/README.md b/emelyanov_artem_lab_2/README.md index e69de29..5978d5d 100644 --- a/emelyanov_artem_lab_2/README.md +++ b/emelyanov_artem_lab_2/README.md @@ -0,0 +1,23 @@ +# Распределённое приложение для поиска файлов и обработки чисел +## Описаниe +Данное распределённое приложение состоит из двух консольных Java-приложений, которые работают в контейнерах Docker. Приложения выполняют следующие задачи: + +### file-finder: +Ищет самый большой файл в директории /var/data и копирует его в /var/result/data.txt. +### number-processor: +Считывает числа из файла /var/result/data.txt и сохраняет произведение первого и последнего числа в файл /var/result/result.txt. + +#### Приложения работают совместно через Docker Compose, используя общий том для передачи файлов между контейнерами. + +### Как запустить +1. #### Подготовка данных + Убедитесь, что в директории data находятся файлы, которые вы хотите обработать. Это могут быть текстовые файлы с числами. + +2. #### Сборка и запуск контейнеров + Выполните команду для сборки и запуска контейнеров с помощью Docker Compose: docker-compose up --build + +3. #### Результаты выполнения + #### Приложение file-finder находит самый большой файл в директории /var/data (локально это монтируемая директория data/) и копирует его в файл /var/result/data.txt. + #### Приложение number-processor читает файл /var/result/data.txt и сохраняет произведение первого и последнего числа в файл /var/result/result.txt. + +#### Ссылка на видео https://drive.google.com/file/d/1u7nwZdUI4KHC4NzUAXdOABflYswokGwx/view \ No newline at end of file From 121e4bbcd2f306c5fc8d44c096040b0d0078c288 Mon Sep 17 00:00:00 2001 From: Zara28 Date: Tue, 17 Sep 2024 22:46:46 +0400 Subject: [PATCH 3/7] dozorova_alena_lab_2 --- .gitignore | 9 +++ .../ConsoleApp1/.dockerignore | 30 ++++++++ .../ConsoleApp1/ConsoleApp1.csproj | 13 ++++ .../ConsoleApp1/ConsoleApp1.csproj.user | 7 ++ .../ConsoleApp1/ConsoleApp1.sln | 25 +++++++ dozorova_alena_lab_2/ConsoleApp1/Dockerfile | 22 ++++++ dozorova_alena_lab_2/ConsoleApp1/Program.cs | 32 +++++++++ .../Properties/launchSettings.json | 10 +++ .../ConsoleApp2/.dockerignore | 30 ++++++++ .../ConsoleApp2/ConsoleApp2.csproj | 16 +++++ .../ConsoleApp2/ConsoleApp2.csproj.user | 6 ++ .../ConsoleApp2/ConsoleApp2.sln | 25 +++++++ dozorova_alena_lab_2/ConsoleApp2/Dockerfile | 22 ++++++ dozorova_alena_lab_2/ConsoleApp2/Program.cs | 16 +++++ .../Properties/launchSettings.json | 10 +++ dozorova_alena_lab_2/FilesInput/First/0.txt | 1 + dozorova_alena_lab_2/FilesInput/First/1.txt | 1 + dozorova_alena_lab_2/FilesInput/First/10.txt | 1 + dozorova_alena_lab_2/FilesInput/First/11.txt | 1 + dozorova_alena_lab_2/FilesInput/First/12.txt | 1 + dozorova_alena_lab_2/FilesInput/First/13.txt | 1 + dozorova_alena_lab_2/FilesInput/First/14.txt | 1 + dozorova_alena_lab_2/FilesInput/First/15.txt | 1 + dozorova_alena_lab_2/FilesInput/First/16.txt | 1 + dozorova_alena_lab_2/FilesInput/First/17.txt | 1 + dozorova_alena_lab_2/FilesInput/First/18.txt | 1 + dozorova_alena_lab_2/FilesInput/First/19.txt | 1 + dozorova_alena_lab_2/FilesInput/First/2.txt | 1 + dozorova_alena_lab_2/FilesInput/First/20.txt | 1 + dozorova_alena_lab_2/FilesInput/First/21.txt | 1 + dozorova_alena_lab_2/FilesInput/First/22.txt | 1 + dozorova_alena_lab_2/FilesInput/First/23.txt | 1 + dozorova_alena_lab_2/FilesInput/First/24.txt | 1 + dozorova_alena_lab_2/FilesInput/First/25.txt | 1 + dozorova_alena_lab_2/FilesInput/First/26.txt | 1 + dozorova_alena_lab_2/FilesInput/First/27.txt | 1 + dozorova_alena_lab_2/FilesInput/First/28.txt | 1 + dozorova_alena_lab_2/FilesInput/First/29.txt | 1 + dozorova_alena_lab_2/FilesInput/First/3.txt | 1 + dozorova_alena_lab_2/FilesInput/First/30.txt | 1 + dozorova_alena_lab_2/FilesInput/First/31.txt | 1 + dozorova_alena_lab_2/FilesInput/First/32.txt | 1 + dozorova_alena_lab_2/FilesInput/First/33.txt | 1 + dozorova_alena_lab_2/FilesInput/First/34.txt | 1 + dozorova_alena_lab_2/FilesInput/First/35.txt | 1 + dozorova_alena_lab_2/FilesInput/First/36.txt | 1 + dozorova_alena_lab_2/FilesInput/First/37.txt | 1 + dozorova_alena_lab_2/FilesInput/First/38.txt | 1 + dozorova_alena_lab_2/FilesInput/First/4.txt | 1 + dozorova_alena_lab_2/FilesInput/First/5.txt | 1 + dozorova_alena_lab_2/FilesInput/First/6.txt | 1 + dozorova_alena_lab_2/FilesInput/First/7.txt | 1 + dozorova_alena_lab_2/FilesInput/First/8.txt | 1 + dozorova_alena_lab_2/FilesInput/First/9.txt | 1 + .../FilesInput/Second/data.txt | 1 + dozorova_alena_lab_2/FilesOutput/result.txt | 1 + dozorova_alena_lab_2/docker-compose.yml | 14 ++++ dozorova_alena_lab_2/readme.md | 70 +++++++++++++++++++ 58 files changed, 398 insertions(+) create mode 100644 .gitignore create mode 100644 dozorova_alena_lab_2/ConsoleApp1/.dockerignore create mode 100644 dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.csproj create mode 100644 dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.csproj.user create mode 100644 dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.sln create mode 100644 dozorova_alena_lab_2/ConsoleApp1/Dockerfile create mode 100644 dozorova_alena_lab_2/ConsoleApp1/Program.cs create mode 100644 dozorova_alena_lab_2/ConsoleApp1/Properties/launchSettings.json create mode 100644 dozorova_alena_lab_2/ConsoleApp2/.dockerignore create mode 100644 dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.csproj create mode 100644 dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.csproj.user create mode 100644 dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.sln create mode 100644 dozorova_alena_lab_2/ConsoleApp2/Dockerfile create mode 100644 dozorova_alena_lab_2/ConsoleApp2/Program.cs create mode 100644 dozorova_alena_lab_2/ConsoleApp2/Properties/launchSettings.json create mode 100644 dozorova_alena_lab_2/FilesInput/First/0.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/1.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/10.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/11.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/12.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/13.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/14.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/15.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/16.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/17.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/18.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/19.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/2.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/20.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/21.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/22.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/23.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/24.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/25.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/26.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/27.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/28.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/29.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/3.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/30.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/31.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/32.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/33.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/34.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/35.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/36.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/37.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/38.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/4.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/5.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/6.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/7.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/8.txt create mode 100644 dozorova_alena_lab_2/FilesInput/First/9.txt create mode 100644 dozorova_alena_lab_2/FilesInput/Second/data.txt create mode 100644 dozorova_alena_lab_2/FilesOutput/result.txt create mode 100644 dozorova_alena_lab_2/docker-compose.yml create mode 100644 dozorova_alena_lab_2/readme.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..697082a --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ + +/dozorova_alena_lab_2/.vs +/dozorova_alena_lab_2/ConsoleApp1/.vs +/dozorova_alena_lab_2/ConsoleApp1/bin +/dozorova_alena_lab_2/ConsoleApp1/obj +/dozorova_alena_lab_2/ConsoleApp1/Properties/PublishProfiles +/dozorova_alena_lab_2/ConsoleApp2/.vs +/dozorova_alena_lab_2/ConsoleApp2/bin +/dozorova_alena_lab_2/ConsoleApp2/obj diff --git a/dozorova_alena_lab_2/ConsoleApp1/.dockerignore b/dozorova_alena_lab_2/ConsoleApp1/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp1/.dockerignore @@ -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/** \ No newline at end of file diff --git a/dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.csproj b/dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.csproj new file mode 100644 index 0000000..599ec87 --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.csproj @@ -0,0 +1,13 @@ + + + Exe + net6.0 + enable + enable + Linux + . + + + + + \ No newline at end of file diff --git a/dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.csproj.user b/dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.csproj.user new file mode 100644 index 0000000..6c031cb --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.csproj.user @@ -0,0 +1,7 @@ + + + + Container (Dockerfile) + <_LastSelectedProfileId>C:\Users\Alena\WorkFolder\Study\politech\7\РВиП\DAS_2024_1\dozorova_alena_lab_2\ConsoleApp1\Properties\PublishProfiles\registry.hub.docker.com_alenadozorova.pubxml + + \ No newline at end of file diff --git a/dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.sln b/dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.sln new file mode 100644 index 0000000..12f3d98 --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp1/ConsoleApp1.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.10.35004.147 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1.csproj", "{093B5FCB-33F6-4F14-B150-87DA092D2BFA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {093B5FCB-33F6-4F14-B150-87DA092D2BFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {093B5FCB-33F6-4F14-B150-87DA092D2BFA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {093B5FCB-33F6-4F14-B150-87DA092D2BFA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {093B5FCB-33F6-4F14-B150-87DA092D2BFA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CDC30087-C732-4ED0-97FB-E43A9F219F67} + EndGlobalSection +EndGlobal diff --git a/dozorova_alena_lab_2/ConsoleApp1/Dockerfile b/dozorova_alena_lab_2/ConsoleApp1/Dockerfile new file mode 100644 index 0000000..6bbf72d --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp1/Dockerfile @@ -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:6.0 AS base +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["ConsoleApp1.csproj", "."] +RUN dotnet restore "./ConsoleApp1.csproj" +COPY . . +WORKDIR "/src/." +RUN dotnet build "./ConsoleApp1.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./ConsoleApp1.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "ConsoleApp1.dll"] \ No newline at end of file diff --git a/dozorova_alena_lab_2/ConsoleApp1/Program.cs b/dozorova_alena_lab_2/ConsoleApp1/Program.cs new file mode 100644 index 0000000..5440c09 --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp1/Program.cs @@ -0,0 +1,32 @@ +// Ищет в каталоге /var/data файл с самым коротким названием и перекладывает +// его в /var/result/data.txt. + +Console.WriteLine("Start first service"); +var files = Directory.GetFiles("/var/data/"); + +if(files == null || files.Length == 0) +{ + File.Create("./var/data/data.txt"); +} + +string res = files[0]; + +files.ToList().ForEach(f => +{ + if(res.Length > f.Length) + { + res = f; + } +}); + +Console.WriteLine("Find file " + res); + +if(!Directory.Exists("/var/result")) +{ + Directory.CreateDirectory("/var/result"); +} + +File.Copy(res, "/var/result/data.txt"); + +Console.WriteLine("Copy to /var/result/data.txt"); + diff --git a/dozorova_alena_lab_2/ConsoleApp1/Properties/launchSettings.json b/dozorova_alena_lab_2/ConsoleApp1/Properties/launchSettings.json new file mode 100644 index 0000000..1fc0367 --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp1/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "ConsoleApp1": { + "commandName": "Project" + }, + "Container (Dockerfile)": { + "commandName": "Docker" + } + } +} \ No newline at end of file diff --git a/dozorova_alena_lab_2/ConsoleApp2/.dockerignore b/dozorova_alena_lab_2/ConsoleApp2/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp2/.dockerignore @@ -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/** \ No newline at end of file diff --git a/dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.csproj b/dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.csproj new file mode 100644 index 0000000..7be2204 --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.csproj @@ -0,0 +1,16 @@ + + + + Exe + net6.0 + enable + enable + Linux + . + + + + + + + diff --git a/dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.csproj.user b/dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.csproj.user new file mode 100644 index 0000000..dd2d54c --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.csproj.user @@ -0,0 +1,6 @@ + + + + Container (Dockerfile) + + \ No newline at end of file diff --git a/dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.sln b/dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.sln new file mode 100644 index 0000000..8337ab4 --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp2/ConsoleApp2.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.10.35004.147 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp2", "ConsoleApp2.csproj", "{364FF6E2-3AED-4C3A-B2DD-D20CA9214BB8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {364FF6E2-3AED-4C3A-B2DD-D20CA9214BB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {364FF6E2-3AED-4C3A-B2DD-D20CA9214BB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {364FF6E2-3AED-4C3A-B2DD-D20CA9214BB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {364FF6E2-3AED-4C3A-B2DD-D20CA9214BB8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E5B491A6-064F-48E0-ACBD-E1B4FE3D0898} + EndGlobalSection +EndGlobal diff --git a/dozorova_alena_lab_2/ConsoleApp2/Dockerfile b/dozorova_alena_lab_2/ConsoleApp2/Dockerfile new file mode 100644 index 0000000..3d0b78d --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp2/Dockerfile @@ -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:6.0 AS base +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["ConsoleApp2.csproj", "."] +RUN dotnet restore "./ConsoleApp2.csproj" +COPY . . +WORKDIR "/src/." +RUN dotnet build "./ConsoleApp2.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./ConsoleApp2.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "ConsoleApp2.dll"] \ No newline at end of file diff --git a/dozorova_alena_lab_2/ConsoleApp2/Program.cs b/dozorova_alena_lab_2/ConsoleApp2/Program.cs new file mode 100644 index 0000000..ccbf2e3 --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp2/Program.cs @@ -0,0 +1,16 @@ +// Ищет набольшее число из файла /var/data/data.txt и сохраняет +// его вторую степень в /var/result/result.txt. +Console.WriteLine("Start second service"); +var data = File.ReadAllText("/var/data/data.txt").Split(" ").ToList(); + +var max = data.Select(x => Int32.TryParse(x, out int value) ? value : 0).Max(); + +Console.WriteLine("Find max value: "+max); +if(!Directory.Exists("/var/result/")) +{ + Directory.CreateDirectory("/var/result/"); +} + +File.WriteAllText("/var/result/result.txt", Math.Pow(max, 2).ToString()); + +Console.WriteLine("Save to /var/result/result.txt"); \ No newline at end of file diff --git a/dozorova_alena_lab_2/ConsoleApp2/Properties/launchSettings.json b/dozorova_alena_lab_2/ConsoleApp2/Properties/launchSettings.json new file mode 100644 index 0000000..7d85e14 --- /dev/null +++ b/dozorova_alena_lab_2/ConsoleApp2/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "ConsoleApp2": { + "commandName": "Project" + }, + "Container (Dockerfile)": { + "commandName": "Docker" + } + } +} \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/0.txt b/dozorova_alena_lab_2/FilesInput/First/0.txt new file mode 100644 index 0000000..85b45be --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/0.txt @@ -0,0 +1 @@ +52 32 22 57 23 30 63 22 27 32 10 0 58 40 83 86 21 87 84 27 44 31 59 35 37 57 21 97 87 7 23 89 27 35 55 9 14 35 59 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/1.txt b/dozorova_alena_lab_2/FilesInput/First/1.txt new file mode 100644 index 0000000..252c02b --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/1.txt @@ -0,0 +1 @@ +93 95 67 2 81 16 46 47 40 43 93 71 16 63 6 86 94 8 55 32 59 28 71 43 39 29 60 23 43 75 67 70 73 50 75 65 10 99 41 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/10.txt b/dozorova_alena_lab_2/FilesInput/First/10.txt new file mode 100644 index 0000000..35d8815 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/10.txt @@ -0,0 +1 @@ +48 88 38 25 7 96 34 30 92 34 97 0 81 41 94 85 4 82 77 23 41 8 78 93 38 12 27 55 97 46 20 52 88 54 35 72 62 28 43 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/11.txt b/dozorova_alena_lab_2/FilesInput/First/11.txt new file mode 100644 index 0000000..2de3f85 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/11.txt @@ -0,0 +1 @@ +14 3 92 80 29 21 88 21 98 41 64 10 73 57 31 27 92 84 53 37 35 27 60 52 54 90 89 4 90 95 26 79 55 31 34 17 26 90 49 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/12.txt b/dozorova_alena_lab_2/FilesInput/First/12.txt new file mode 100644 index 0000000..cb6764e --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/12.txt @@ -0,0 +1 @@ +66 33 75 48 42 37 2 29 34 77 0 11 59 38 61 80 85 29 50 59 14 64 37 91 65 65 3 14 41 19 13 49 42 30 55 69 81 8 39 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/13.txt b/dozorova_alena_lab_2/FilesInput/First/13.txt new file mode 100644 index 0000000..83eea89 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/13.txt @@ -0,0 +1 @@ +57 54 24 59 80 67 13 95 86 96 58 60 32 20 79 56 5 98 27 5 71 92 1 54 47 85 33 87 97 41 49 52 35 86 60 21 64 76 75 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/14.txt b/dozorova_alena_lab_2/FilesInput/First/14.txt new file mode 100644 index 0000000..b69c830 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/14.txt @@ -0,0 +1 @@ +75 57 65 15 61 79 94 34 49 33 25 58 91 55 91 81 64 50 25 46 87 44 28 65 15 68 94 56 58 2 40 39 14 29 35 24 9 48 65 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/15.txt b/dozorova_alena_lab_2/FilesInput/First/15.txt new file mode 100644 index 0000000..4293908 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/15.txt @@ -0,0 +1 @@ +91 31 90 98 76 35 61 95 67 78 23 91 26 33 2 44 93 20 90 14 33 22 19 35 57 65 81 62 91 84 69 74 55 34 63 98 64 4 77 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/16.txt b/dozorova_alena_lab_2/FilesInput/First/16.txt new file mode 100644 index 0000000..bcfad3f --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/16.txt @@ -0,0 +1 @@ +41 11 46 24 85 69 93 45 33 33 97 31 91 75 43 60 32 3 76 58 70 66 97 7 75 14 62 1 32 17 54 79 3 59 67 15 43 92 43 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/17.txt b/dozorova_alena_lab_2/FilesInput/First/17.txt new file mode 100644 index 0000000..899f58f --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/17.txt @@ -0,0 +1 @@ +36 88 91 3 42 4 87 65 42 10 95 54 71 79 60 9 5 63 87 27 75 79 67 45 89 32 65 38 64 22 73 78 48 57 89 28 81 58 18 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/18.txt b/dozorova_alena_lab_2/FilesInput/First/18.txt new file mode 100644 index 0000000..599a026 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/18.txt @@ -0,0 +1 @@ +39 86 99 32 34 57 95 27 73 90 80 62 85 91 50 24 54 36 15 87 6 54 63 63 78 10 18 90 9 20 14 57 54 4 97 22 80 50 24 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/19.txt b/dozorova_alena_lab_2/FilesInput/First/19.txt new file mode 100644 index 0000000..c5a78c4 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/19.txt @@ -0,0 +1 @@ +32 65 91 95 28 84 23 47 63 3 78 70 48 15 17 58 22 20 67 58 27 24 68 97 3 55 57 9 18 85 14 16 23 10 1 97 24 64 83 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/2.txt b/dozorova_alena_lab_2/FilesInput/First/2.txt new file mode 100644 index 0000000..a933198 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/2.txt @@ -0,0 +1 @@ +50 60 55 6 46 82 92 76 47 53 94 93 58 71 54 68 83 56 32 39 96 9 31 93 30 72 88 15 1 45 5 98 64 83 45 60 73 69 74 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/20.txt b/dozorova_alena_lab_2/FilesInput/First/20.txt new file mode 100644 index 0000000..b6d09fa --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/20.txt @@ -0,0 +1 @@ +26 79 84 64 17 53 9 84 52 98 27 42 8 11 83 67 66 57 81 80 47 95 53 98 66 88 60 0 93 98 43 87 47 17 48 49 28 35 28 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/21.txt b/dozorova_alena_lab_2/FilesInput/First/21.txt new file mode 100644 index 0000000..3cec464 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/21.txt @@ -0,0 +1 @@ +60 70 16 18 71 67 22 71 54 55 70 57 13 54 84 73 99 27 53 13 49 68 12 89 96 77 93 52 80 62 59 11 73 9 33 40 49 82 1 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/22.txt b/dozorova_alena_lab_2/FilesInput/First/22.txt new file mode 100644 index 0000000..3ce9290 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/22.txt @@ -0,0 +1 @@ +67 22 18 71 64 80 19 5 28 2 75 73 9 51 8 81 76 36 96 26 58 96 95 4 88 51 24 10 71 33 79 63 21 59 95 61 28 97 40 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/23.txt b/dozorova_alena_lab_2/FilesInput/First/23.txt new file mode 100644 index 0000000..279a9fd --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/23.txt @@ -0,0 +1 @@ +62 36 50 68 46 3 28 7 16 30 26 1 21 39 27 78 13 92 34 6 6 38 70 1 1 42 45 20 98 49 61 24 51 45 56 33 53 3 75 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/24.txt b/dozorova_alena_lab_2/FilesInput/First/24.txt new file mode 100644 index 0000000..c6b785a --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/24.txt @@ -0,0 +1 @@ +81 40 95 8 98 87 88 60 51 87 38 42 13 99 75 24 98 90 33 71 99 41 95 68 39 52 9 64 77 61 70 17 90 91 64 53 41 13 5 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/25.txt b/dozorova_alena_lab_2/FilesInput/First/25.txt new file mode 100644 index 0000000..574d4ec --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/25.txt @@ -0,0 +1 @@ +79 25 4 32 1 51 91 16 26 23 87 8 98 25 23 86 23 94 24 35 34 84 54 79 46 18 40 48 90 9 98 80 37 20 80 79 4 13 57 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/26.txt b/dozorova_alena_lab_2/FilesInput/First/26.txt new file mode 100644 index 0000000..8caa6bf --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/26.txt @@ -0,0 +1 @@ +66 95 69 29 36 5 17 70 97 10 6 72 92 87 72 90 68 94 77 49 23 68 73 74 77 49 94 75 40 52 57 70 80 77 67 34 67 65 61 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/27.txt b/dozorova_alena_lab_2/FilesInput/First/27.txt new file mode 100644 index 0000000..8e91577 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/27.txt @@ -0,0 +1 @@ +21 5 57 27 17 89 4 91 80 49 55 57 92 9 61 37 92 33 28 18 27 45 88 7 61 26 22 64 24 17 63 70 75 1 69 96 62 77 47 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/28.txt b/dozorova_alena_lab_2/FilesInput/First/28.txt new file mode 100644 index 0000000..67c6f55 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/28.txt @@ -0,0 +1 @@ +28 63 7 24 14 25 49 42 34 18 14 1 59 60 47 21 75 54 29 11 89 46 90 69 61 37 18 75 55 43 43 16 80 93 55 27 67 50 11 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/29.txt b/dozorova_alena_lab_2/FilesInput/First/29.txt new file mode 100644 index 0000000..a288228 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/29.txt @@ -0,0 +1 @@ +35 9 60 57 42 99 29 73 61 44 21 75 18 96 67 9 81 37 39 54 83 33 62 62 17 30 11 7 30 10 37 1 36 75 92 40 77 37 69 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/3.txt b/dozorova_alena_lab_2/FilesInput/First/3.txt new file mode 100644 index 0000000..55fb352 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/3.txt @@ -0,0 +1 @@ +10 26 86 88 31 39 62 76 84 21 83 62 10 0 70 87 46 67 31 19 40 17 68 18 57 87 63 58 21 90 31 74 30 76 4 25 47 77 88 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/30.txt b/dozorova_alena_lab_2/FilesInput/First/30.txt new file mode 100644 index 0000000..4c0df26 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/30.txt @@ -0,0 +1 @@ +2 39 85 29 46 99 69 64 89 20 5 72 23 47 57 14 64 9 62 22 15 48 93 51 14 28 97 18 60 48 44 9 70 22 25 69 53 86 67 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/31.txt b/dozorova_alena_lab_2/FilesInput/First/31.txt new file mode 100644 index 0000000..1cdff86 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/31.txt @@ -0,0 +1 @@ +21 39 28 1 2 38 90 22 23 47 88 51 84 55 44 20 74 48 66 82 9 37 39 5 30 24 53 33 25 1 83 69 61 80 68 30 55 49 61 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/32.txt b/dozorova_alena_lab_2/FilesInput/First/32.txt new file mode 100644 index 0000000..b77936c --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/32.txt @@ -0,0 +1 @@ +77 3 9 39 23 95 77 44 53 18 33 10 85 90 84 47 55 48 69 91 44 93 70 1 30 12 64 98 15 57 43 18 69 61 8 17 77 16 95 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/33.txt b/dozorova_alena_lab_2/FilesInput/First/33.txt new file mode 100644 index 0000000..fd1dc3e --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/33.txt @@ -0,0 +1 @@ +13 6 29 65 44 37 43 75 20 61 35 9 39 20 28 58 58 55 11 16 18 65 62 41 36 96 63 75 61 5 13 75 9 84 1 59 73 87 10 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/34.txt b/dozorova_alena_lab_2/FilesInput/First/34.txt new file mode 100644 index 0000000..a1efda9 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/34.txt @@ -0,0 +1 @@ +57 35 36 64 48 37 9 72 89 61 83 89 29 6 13 25 11 41 33 21 68 58 74 63 54 48 16 49 53 1 70 93 3 87 9 34 69 77 95 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/35.txt b/dozorova_alena_lab_2/FilesInput/First/35.txt new file mode 100644 index 0000000..cbafe7e --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/35.txt @@ -0,0 +1 @@ +34 62 93 45 30 62 34 1 60 29 15 69 96 74 2 24 98 13 95 65 0 36 64 37 60 56 54 55 7 49 10 21 16 86 63 49 96 11 26 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/36.txt b/dozorova_alena_lab_2/FilesInput/First/36.txt new file mode 100644 index 0000000..1d2c8bd --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/36.txt @@ -0,0 +1 @@ +29 15 87 70 80 67 79 64 7 52 29 91 5 88 52 77 83 56 74 34 27 27 25 22 95 91 56 10 21 84 82 54 92 94 98 23 56 65 43 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/37.txt b/dozorova_alena_lab_2/FilesInput/First/37.txt new file mode 100644 index 0000000..6c47d53 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/37.txt @@ -0,0 +1 @@ +87 41 82 29 38 22 89 69 3 92 55 73 0 30 70 20 71 96 98 38 60 26 62 21 34 0 10 99 71 31 83 40 56 25 40 16 21 48 17 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/38.txt b/dozorova_alena_lab_2/FilesInput/First/38.txt new file mode 100644 index 0000000..f9a19a7 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/38.txt @@ -0,0 +1 @@ +69 78 36 30 6 95 39 12 30 63 57 84 83 8 25 50 64 96 84 1 99 85 67 48 72 93 93 90 99 74 58 39 15 66 3 11 72 87 70 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/4.txt b/dozorova_alena_lab_2/FilesInput/First/4.txt new file mode 100644 index 0000000..d21d0e5 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/4.txt @@ -0,0 +1 @@ +88 14 19 72 87 34 86 83 13 68 37 54 93 97 67 68 3 8 37 24 22 52 98 83 64 88 0 89 46 7 78 78 26 45 14 10 91 45 35 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/5.txt b/dozorova_alena_lab_2/FilesInput/First/5.txt new file mode 100644 index 0000000..d099947 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/5.txt @@ -0,0 +1 @@ +46 1 4 50 36 86 56 84 17 54 89 38 36 25 4 93 48 97 63 99 34 42 0 9 16 88 82 10 98 57 0 37 41 33 32 27 61 43 3 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/6.txt b/dozorova_alena_lab_2/FilesInput/First/6.txt new file mode 100644 index 0000000..87d0082 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/6.txt @@ -0,0 +1 @@ +32 0 85 46 21 63 83 28 15 57 69 68 65 72 86 9 56 3 11 33 62 50 85 20 37 92 61 66 60 78 68 66 84 9 6 77 32 19 36 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/7.txt b/dozorova_alena_lab_2/FilesInput/First/7.txt new file mode 100644 index 0000000..a69e9f4 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/7.txt @@ -0,0 +1 @@ +59 49 82 65 53 10 15 58 87 83 57 14 54 34 52 98 97 2 11 1 68 7 15 69 57 67 83 7 26 6 38 31 1 60 38 88 72 33 41 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/8.txt b/dozorova_alena_lab_2/FilesInput/First/8.txt new file mode 100644 index 0000000..b42b4f3 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/8.txt @@ -0,0 +1 @@ +76 27 40 19 12 76 83 72 55 53 80 20 94 17 20 8 77 52 87 40 20 36 81 92 56 31 31 33 51 18 28 10 44 88 63 41 15 53 64 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/First/9.txt b/dozorova_alena_lab_2/FilesInput/First/9.txt new file mode 100644 index 0000000..cbc48b0 --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/First/9.txt @@ -0,0 +1 @@ +11 56 97 86 0 43 38 49 0 91 1 94 58 27 82 9 25 7 28 41 37 97 44 97 87 96 74 9 10 89 91 51 94 32 77 34 15 12 0 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesInput/Second/data.txt b/dozorova_alena_lab_2/FilesInput/Second/data.txt new file mode 100644 index 0000000..85b45be --- /dev/null +++ b/dozorova_alena_lab_2/FilesInput/Second/data.txt @@ -0,0 +1 @@ +52 32 22 57 23 30 63 22 27 32 10 0 58 40 83 86 21 87 84 27 44 31 59 35 37 57 21 97 87 7 23 89 27 35 55 9 14 35 59 \ No newline at end of file diff --git a/dozorova_alena_lab_2/FilesOutput/result.txt b/dozorova_alena_lab_2/FilesOutput/result.txt new file mode 100644 index 0000000..5a0a33a --- /dev/null +++ b/dozorova_alena_lab_2/FilesOutput/result.txt @@ -0,0 +1 @@ +9409 \ No newline at end of file diff --git a/dozorova_alena_lab_2/docker-compose.yml b/dozorova_alena_lab_2/docker-compose.yml new file mode 100644 index 0000000..4e6538b --- /dev/null +++ b/dozorova_alena_lab_2/docker-compose.yml @@ -0,0 +1,14 @@ +services: + first: + build: ./ConsoleApp1/ + volumes: + - ./FilesInput/First:/var/data + - ./FilesInput/Second:/var/result + + second: + build: ./ConsoleApp2/ + depends_on: + - first + volumes: + - ./FilesInput/Second:/var/data + - ./FilesOutput:/var/result \ No newline at end of file diff --git a/dozorova_alena_lab_2/readme.md b/dozorova_alena_lab_2/readme.md new file mode 100644 index 0000000..736c1cc --- /dev/null +++ b/dozorova_alena_lab_2/readme.md @@ -0,0 +1,70 @@ +# Лабораторная работа 2 +В рамках лабораторной работы были реализованы два сервиса, для которых выходные данные первого являются входными данными второго. +## Описание +Варианты: +Первый сервис - 5 +Второй сервис - 1 +Оба сервиса являются консольным приложением с сгенерированным dockerfile +В результате были проброшены папки следующим образом: +для первого сервиса : +``` + volumes: + - ./FilesInput/First:/var/data + - ./FilesInput/Second:/var/result +``` +для второго сервиса: +``` + volumes: + - ./FilesInput/Second:/var/data + - ./FilesOutput:/var/result +``` +## Запуск +Для запуска лабораторной работы необходимо иметь запущенный Docker. +Из папки, где находится файл docker-compose.yml запустить консоль и выполнить: +``` +docker compose up --build +``` +Флаг `--build` указывает на то, что необходимо выполнить сборку исходников. +После сборки мы получим следующие логи: +[+] Running 3/2 + ✔ Network dozorova_alena_lab_2_default Created 0.2s + ✔ Container dozorova_alena_lab_2-first-1 Created 0.1s + ✔ Container dozorova_alena_lab_2-second-1 Created 0.0s +Attaching to first-1, second-1 +first-1 | Start first service +first-1 | Find file /var/data/0.txt +first-1 | Copy to /var/result/data.txt +first-1 exited with code 0 +second-1 | Start second service +second-1 | Find max value: 97 +second-1 | Save to /var/result/result.txt +second-1 exited with code 0 +## Пример dockerfile +``` +FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base #базовый образ сборки +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build #используем sdk для сборки +ARG BUILD_CONFIGURATION=Release #сборку проводим в релизной конфигурации +WORKDIR /src +COPY ["ConsoleApp2.csproj", "."] #копируем в контейнер +RUN dotnet restore "./ConsoleApp2.csproj" #восстанавливаем зависимости +COPY . . #копируем в папку сборки +WORKDIR "/src/." +RUN dotnet build "./ConsoleApp2.csproj" -c $BUILD_CONFIGURATION -o /app/build #собираем проект + +FROM build AS publish #все, что создалось в папке publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./ConsoleApp2.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false #публикуем в /app/publish + +FROM base AS final #берем базовый образ +WORKDIR /app #указываем рабочую папку +COPY --from=publish /app/publish . #опубликованное копируем в app +ENTRYPOINT ["dotnet", "ConsoleApp2.dll"] #указываем команду запуска приложения +``` + +## Особенности compose файла +Директива`depends_on` позволяет указать, какого сервиса мы дожидаемся, прежде чем запустимся. +Директива `build` позволяет использовать не уже готовый образ, а тот, что будет собран непосредственно в момент запуска. +## Видеодемонстрация +Был записан видеоролик, демонстрирующий процесс запуска и работы сервисов. Он расположен по [адресу](https://drive.google.com/file/d/1BOt_Ja9AanINPjJyRKzgUaghRGwJYdd7/view?usp=drive_link) \ No newline at end of file From 891eae42115dfc3dc2eda9a787b050177fdf8eaa Mon Sep 17 00:00:00 2001 From: mochalov danila Date: Wed, 18 Sep 2024 17:02:04 +0400 Subject: [PATCH 4/7] mochalov_danila_lab_1 is ready --- mochalov_danila_lab_1/LocalSettings.php | 140 +++++++++++++++++++++++ mochalov_danila_lab_1/README.md | 40 +++++++ mochalov_danila_lab_1/docker-compose.yml | 52 +++++++++ 3 files changed, 232 insertions(+) create mode 100644 mochalov_danila_lab_1/LocalSettings.php create mode 100644 mochalov_danila_lab_1/README.md create mode 100644 mochalov_danila_lab_1/docker-compose.yml diff --git a/mochalov_danila_lab_1/LocalSettings.php b/mochalov_danila_lab_1/LocalSettings.php new file mode 100644 index 0000000..9644427 --- /dev/null +++ b/mochalov_danila_lab_1/LocalSettings.php @@ -0,0 +1,140 @@ + "$wgResourceBasePath/resources/assets/change-your-logo.svg", + 'icon' => "$wgResourceBasePath/resources/assets/change-your-logo-icon.svg", +]; + +## UPO means: this is also a user preference option + +$wgEnableEmail = true; +$wgEnableUserEmail = true; # UPO + +$wgEmergencyContact = ''; +$wgPasswordSender = ''; + +$wgEnotifUserTalk = false; # UPO +$wgEnotifWatchlist = false; # UPO +$wgEmailAuthentication = true; + +## Database settings +$wgDBtype = 'mysql'; +$wgDBserver = 'mariadb'; +$wgDBname = 'my_wiki'; +$wgDBuser = 'wikiuser'; +$wgDBpassword = 'password'; + +# MySQL specific settings +$wgDBprefix = ""; +$wgDBssl = false; + +# MySQL table options to use during installation or update +$wgDBTableOptions = "ENGINE=InnoDB, DEFAULT CHARSET=binary"; + +# Shared database table +# This has no effect unless $wgSharedDB is also set. +$wgSharedTables[] = "actor"; + +## Shared memory settings +$wgMainCacheType = CACHE_NONE; +$wgMemCachedServers = []; + +## To enable image uploads, make sure the 'images' directory +## is writable, then set this to true: +$wgEnableUploads = false; +$wgUseImageMagick = true; +$wgImageMagickConvertCommand = '/usr/bin/convert'; + +# InstantCommons allows wiki to use images from https://commons.wikimedia.org +$wgUseInstantCommons = false; + +# Periodically send a pingback to https://www.mediawiki.org/ with basic data +# about this MediaWiki instance. The Wikimedia Foundation shares this data +# with MediaWiki developers to help guide future development efforts. +$wgPingback = false; + +# Site language code, should be one of the list in ./includes/languages/data/Names.php +$wgLanguageCode = 'ru'; + +# Time zone +$wgLocaltimezone = 'UTC'; + +## Set $wgCacheDirectory to a writable directory on the web server +## to make your wiki go slightly faster. The directory should not +## be publicly accessible from the web. +#$wgCacheDirectory = "$IP/cache"; + +$wgSecretKey = '35e36bd38120ddaa8ba6e353d81951b7b85c7be00e0ee915c4bb4bfa44477368'; + +# Changing this will log out all existing sessions. +$wgAuthenticationTokenVersion = '1'; + +# Site upgrade key. Must be set to a string (default provided) to turn on the +# web installer while LocalSettings.php is in place +$wgUpgradeKey = '698fd18eabeec460'; + +## For attaching licensing metadata to pages, and displaying an +## appropriate copyright notice / icon. GNU Free Documentation +## License and Creative Commons licenses are supported so far. +$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright +$wgRightsUrl = ''; +$wgRightsText = ''; +$wgRightsIcon = ""; + +# Path to the GNU diff3 utility. Used for conflict resolution. +$wgDiff3 = '/usr/bin/diff3'; + +## Default skin: you can change the default skin. Use the internal symbolic +## names, e.g. 'vector' or 'monobook': +$wgDefaultSkin = 'vector-2022'; + +# Enabled skins. +# The following skins were automatically enabled: +wfLoadSkin( 'MinervaNeue' ); +wfLoadSkin( 'MonoBook' ); +wfLoadSkin( 'Timeless' ); +wfLoadSkin( 'Vector' ); + + +# End of automatically generated settings. +# Add more configuration options below. + diff --git a/mochalov_danila_lab_1/README.md b/mochalov_danila_lab_1/README.md new file mode 100644 index 0000000..2d59f12 --- /dev/null +++ b/mochalov_danila_lab_1/README.md @@ -0,0 +1,40 @@ +# Лабораторная работа №1 + +## Описание +Для выполнения данной лабораторной работы были развернуты следующие сервисы: + - mediawiki - Вики-движок; + - mariadb - БД для сервиса mediawiki; + - drupal - Система управления контентом; + - postgres - БД для сервиса drupal. + +В файле docker-compose прописаны инструкции для запуска четырех контейнеров с сервисами. +Для пояснения инструкций для каждой строки добавлены комментарии с объяснением. + +## Запуск +Для запуска необходимо перейти в папку с файлом docker-compose и ввести команду в терминале +``` +docker compose up -d +``` +Флаг -d позволяет запустить контейнеры в фоновом режиме, оставляя доступ к консоли. + +Для полноценного первого запуска сервиса drupal необходимо открыть его веб-клиент и следовать инструкциям. +Для полноценного первого запуска сервиса mediawiki необходимо открыть его веб-клиент после запуска и следовать инструкциям по настройке. +После получения файла LocalSettings.php необходимо: + - расскоментировать строчку ./LocalSettings.php:/var/www/html/LocalSettings.php в docker-compose + - перенести файл в директорию с файлом docker-compose и перезапустить контейнер. + +Для проверки контейнеров после запуска можно использовать команду +``` +docker ps -a +``` +В случае если все контейнеры успешно запущены мы увидим в их в консоли со статусом Up +``` +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +e86a2cd3b071 mediawiki "docker-php-entrypoi…" 42 seconds ago Up 39 seconds 0.0.0.0:8080->80/tcp mochalov_danila_lab_1-mediawiki-1 +260ca4b612fe postgres:16 "docker-entrypoint.s…" 42 seconds ago Up 41 seconds 5432/tcp mochalov_danila_lab_1-postgres-1 +1fbd6c3922e2 mariadb "docker-entrypoint.s…" 42 seconds ago Up 41 seconds 3306/tcp mochalov_danila_lab_1-mariadb-1 +a7d4e194a30a drupal:10-apache "docker-php-entrypoi…" 42 seconds ago Up 40 seconds 0.0.0.0:3000->80/tcp mochalov_danila_lab_1-drupal-1 +``` + +## Демонстрация работы +Для демонстрации работоспособности записан ролик. Доступ по [ссылке] (https://drive.google.com/file/d/1GkJSwaoSUjggKQIRJlNQtJ12QEDtium6/view?usp=sharing) diff --git a/mochalov_danila_lab_1/docker-compose.yml b/mochalov_danila_lab_1/docker-compose.yml new file mode 100644 index 0000000..d977dcb --- /dev/null +++ b/mochalov_danila_lab_1/docker-compose.yml @@ -0,0 +1,52 @@ +services: + mediawiki: # Сервис MediaWiki + image: mediawiki # Образ MediaWiki из Docker Hub + restart: always # Автоматический перезапуск контейнера при сбое + ports: + - 8080:80 # Проброс порта 80 из контейнера на порт 8080 хоста + depends_on: + - mariadb # Запуск MediaWiki только после запуска MariaDB + volumes: + - images:/var/www/html/images # Монтирование volume для хранения данных + - ./LocalSettings.php:/var/www/html/LocalSettings.php # Монтирование локального файла настроек (ЗАКОММЕНТИРОВАТЬ ДО НАСТРОЙКИ) + + mariadb: # Сервис MariaDB + image: mariadb # Образ MariaDB из Docker Hub + restart: always # Автоматический перезапуск контейнера при сбое + environment: # Переменные окружения для настройки базы данных + MYSQL_DATABASE: my_wiki # Название базы данных + MYSQL_USER: wikiuser # Имя пользователя для доступа к базе данных + MYSQL_PASSWORD: password # Пароль для пользователя + MYSQL_RANDOM_ROOT_PASSWORD: 'yes' # Случайный пароль для пользователя root + volumes: + - db_maria:/var/lib/mysql # Монтирование volume для хранения данных базы + + drupal: # Сервис Drupal + image: drupal:10-apache # Образ Drupal + ports: + - 3000:80 # Проброс порта 80 из контейнера на порт 3000 хоста + volumes: # Монтирование volumes для хранения локальных файлов Drupal + - drupal-modules:/var/www/html/modules + - drupal-profiles:/var/www/html/profiles + - drupal-themes:/var/www/html/themes + - drupal-sites:/var/www/html/sites + restart: always # Автоматический перезапуск контейнера при сбое + depends_on: + - postgres # Запуск Drupal только после запуска Postgres + + postgres: # Сервис PostgreSQL + image: postgres:16 # Образ PostgreSQL + environment: + POSTGRES_PASSWORD: password # Пароль для пользователя postgres + restart: always # Автоматический перезапуск контейнера при сбое + volumes: + - db_postgres:/var/lib/postgresql # Монтирование volume для хранения данных базы + +volumes: + images: # Volume для хранения изображений MediaWiki + db_maria: # Volume для хранения данных MariaDB + db_postgres: # Volume для хранения данных Postgres + drupal-modules: # Volumes для хранения локальных данных Drupal + drupal-profiles: # Volumes для хранения локальных данных Drupal + drupal-themes: # Volumes для хранения локальных данных Drupal + drupal-sites: # Volumes для хранения локальных данных Drupal From 4922e9075e4560aa3070c120eaf375ce41b9c960 Mon Sep 17 00:00:00 2001 From: BlasphemyGod Date: Wed, 18 Sep 2024 19:01:17 +0400 Subject: [PATCH 5/7] polevoy_sergey_lab_1_completed --- polevoy_sergey_lab_1/docker-compose.yml | 42 +++++++++++++++++++++++++ polevoy_sergey_lab_1/readme.md | 25 +++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 polevoy_sergey_lab_1/docker-compose.yml create mode 100644 polevoy_sergey_lab_1/readme.md diff --git a/polevoy_sergey_lab_1/docker-compose.yml b/polevoy_sergey_lab_1/docker-compose.yml new file mode 100644 index 0000000..9fc0f0d --- /dev/null +++ b/polevoy_sergey_lab_1/docker-compose.yml @@ -0,0 +1,42 @@ +services: # Начало объявления сервисов + gitea: # Указывается название сервиса + image: gitea/gitea:1.22.2 # Указание названия образа (и/или его версии), который будет взят для создания контейнера + restart: always # Указывается политика перезапуска, в данном случае всегда перезапускать контейнер, если он остановился + environment: # Указываются переменные среды + - GITEA__database__DB_TYPE=postgres # Тип базы данных + - GITEA__database__HOST=postgres:5432 # Хост бд. Название сервиса это а-ля доменное имя и внутри сети разрешается в ip нужного контейнера + - GITEA__database__NAME=gitea # Название базы данных + - GITEA__database__USER=superuser # Пользователь базы данных + - GITEA__database__PASSWD=superpassword # Пароль пользователя базы данных + ports: # Перечисляются пробросы портов на хостовую машину. Слева порт хостовой машины, справа порт контейнера + - "3000:3000" # Web интерфейс + - "222:22" # SSH + volumes: # Указываются монтированные тома, папки, файлы. В данном случае в папку /data монтируется объявленный ниже том gitea + - gitea:/data + depends_on: # Указывается зависимость запуска контейнера от другого сервиса, в данном случае запускается только после запуска сервиса бд + - postgres + # Дальше всё по аналогии, различаются лишь названия, переменные окружения, образы, порты и тома + postgres: + image: postgres:14 + restart: always + environment: + - POSTGRES_USER=superuser + - POSTGRES_PASSWORD=superpassword + - POSTGRES_DB=gitea + ports: + - "5432:5432" + volumes: + - postgres:/var/lib/postgresql/data + + rabbitmq: + image: rabbitmq:3-management + environment: + RABBITMQ_DEFAULT_USER: superuser + RABBITMQ_DEFAULT_PASS: superpassword + ports: + - "5672:5672" + - "15672:15672" + +volumes: # Перечисление томов, которые можно использовать как в одном, так и в нескольких сервисах + postgres: + gitea: \ No newline at end of file diff --git a/polevoy_sergey_lab_1/readme.md b/polevoy_sergey_lab_1/readme.md new file mode 100644 index 0000000..a8aae30 --- /dev/null +++ b/polevoy_sergey_lab_1/readme.md @@ -0,0 +1,25 @@ +# Лабораторная работа №1 +В рамках данной лабораторной работы будут развёрнуты следующие сервисы: +1. **Gitea** - система управления версиями +2. **Postgres** - реляционая база данных +3. **Rabbitmq** - брокер сообщений + +Инструкции к запуску контейнеров и пояснения к ним находятся в файле ```docker-compose.yml``` + +## Порядок запуска +#### 1. Установить docker или убедиться, что он установлен +#### 2. Перейти в папку с файлом ```docker-compose.yml``` +#### 3. Выполнить команду в терминале: ```docker-compose up --build --remove-orphans``` + +Проверить успешность запуска можно командой ```docker ps -a```. Если всё прошло успешно, то в терминале будет написано: +``` +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +1a794331b32b gitea/gitea:1.22.2 "/usr/bin/entrypoint…" 20 seconds ago Up 18 seconds 0.0.0.0:3000->3000/tcp, 0.0.0.0:222->22/tcp polevoy_sergey_lab_1-gitea-1 +b5fe33c61c1d rabbitmq:3-management "docker-entrypoint.s…" 20 seconds ago Up 19 seconds 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp rabbitmq +3d2db73d15c5 postgres:14 "docker-entrypoint.s…" 20 seconds ago Up 19 seconds 0.0.0.0:5432->5432/tcp polevoy_sergey_lab_1-postgres-1 +``` + +Работать со всеми перечисленными сервисами можно сразу после запуска за исключением **gitea**. После первого запуска необходимо зайти на сервис, выполнить первоначальную настройку и создать суперпользователя. + +## Видеодемонстрация работы +### Видео доступно по [ссылке](https://disk.yandex.ru/i/3Out4mUV6NEJuA) \ No newline at end of file From 3d98388a134d8868a61b3b70e6161b3aacbed1ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D1=8C=D1=84=D0=B8=D1=8F=20=D0=A2=D1=83=D0=BA?= =?UTF-8?q?=D0=B0=D0=B5=D0=B2=D0=B0?= Date: Wed, 18 Sep 2024 23:09:14 +0400 Subject: [PATCH 6/7] tukaeva_alfiya_lab_1 is ready --- tukaeva_alfiya_lab_1/.env | 4 + tukaeva_alfiya_lab_1/Dockerfile | 13 +++ tukaeva_alfiya_lab_1/README.md | 137 ++++++++++++++++++++++++ tukaeva_alfiya_lab_1/docker-compose.yml | 53 +++++++++ tukaeva_alfiya_lab_1/entrypoint.sh | 15 +++ tukaeva_alfiya_lab_1/lab_1.png | Bin 0 -> 43986 bytes 6 files changed, 222 insertions(+) create mode 100644 tukaeva_alfiya_lab_1/.env create mode 100644 tukaeva_alfiya_lab_1/Dockerfile create mode 100644 tukaeva_alfiya_lab_1/README.md create mode 100644 tukaeva_alfiya_lab_1/docker-compose.yml create mode 100644 tukaeva_alfiya_lab_1/entrypoint.sh create mode 100644 tukaeva_alfiya_lab_1/lab_1.png diff --git a/tukaeva_alfiya_lab_1/.env b/tukaeva_alfiya_lab_1/.env new file mode 100644 index 0000000..b022097 --- /dev/null +++ b/tukaeva_alfiya_lab_1/.env @@ -0,0 +1,4 @@ +DB_HOST = wp_database +DB_USER = wordpress +DB_PASSWORD = wordpress +DB_NAME = wordpress \ No newline at end of file diff --git a/tukaeva_alfiya_lab_1/Dockerfile b/tukaeva_alfiya_lab_1/Dockerfile new file mode 100644 index 0000000..2850456 --- /dev/null +++ b/tukaeva_alfiya_lab_1/Dockerfile @@ -0,0 +1,13 @@ +FROM wordpress:latest + +# Установка WP-CLI +RUN apt-get update && apt-get install -y less \ + && curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \ + && chmod +x wp-cli.phar \ + && mv wp-cli.phar /usr/local/bin/wp + +# Копируем скрипт entrypoint +COPY entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] \ No newline at end of file diff --git a/tukaeva_alfiya_lab_1/README.md b/tukaeva_alfiya_lab_1/README.md new file mode 100644 index 0000000..5dff343 --- /dev/null +++ b/tukaeva_alfiya_lab_1/README.md @@ -0,0 +1,137 @@ +# Лабораторная работа №1 - Знакомство с docker и docker-compose + +## Задание + +Нужно развернуть 3 сервиса в контейнерах docker через docker-compose. + +Необходимые требования: + +* Несколько контейнеров. +* Хотя бы один volume. +* Хотя бы один порт, проброшенный на хост. +* Разворачивание системы должно пройти до конца. + +## Запуск ЛР: + +Введем в терминале команду: +``` +docker-compose up -d +``` +## Использованные сервисы: + + 1. ```db``` - база данные MySQL + + 2. ```redmine``` - Система учёта багов, т.е. баг-трекер. + + 3. ```mediawiki``` - движок вики + + 4. ```wordpress``` - платформа для управления контентом + +## Описание программы: + +Развернутые сервисы: + +### wordpress + +``` +wordpress: # Определение сервиса WordPress + image: wordpress:latest # Используемый образ WordPress последней версии + containername: wp_app # Имя контейнера + restart: always + ports: # Настройка портов + - "8000:80" + environment: # Переменные окружения + WORDPRESSDBHOST: ${DBHOST} + WORDPRESSDBUSER: ${DBUSER} + WORDPRESSDBPASSWORD: ${DBPASSWORD} + WORDPRESSDBNAME: ${DBNAME} + WORDPRESSADMINUSER: admin + WORDPRESSADMINPASSWORD: adminpassword + WORDPRESSADMINEMAIL: admin@example.com + volumes: # Настройка томов + - wordpress_data:/var/www/html + dependson: # Зависимости + - db_wordpress # Зависит от сервиса MySQL + +``` +Эта строка отвечает за образ сброки: +``` +image: wordpress:latest +``` +Задание имени контейнера: +``` +containername: wp_app +``` +Проброс портов: +``` +ports: + - 8000:80 +``` +Тома для хранения данных: +``` +volumes: + - wordpress_data:/var/www/html + +``` +Переменные окружения +``` +environment: + WORDPRESSDBHOST: ${DBHOST} + WORDPRESSDBUSER: ${DBUSER} + WORDPRESSDBPASSWORD: ${DBPASSWORD} + WORDPRESSDBNAME: ${DBNAME} + WORDPRESSADMINUSER: admin + WORDPRESSADMINPASSWORD: adminpassword + WORDPRESSADMINEMAIL: admin@example.com + +``` +Зависимости + +``` +dependson: + - db_wordpress + +``` +Аналогично со другими сервисами: + +### mediawiki + +``` +mediawiki: # Определение сервиса MediaWiki + image: mediawiki:1.35 # Используемый образ MediaWiki версии 1.35 + ports: # Настройка портов + - "8080:80" + containername: mediawiki # Имя контейнера + volumes: # Настройка томов + - mediawiki_data:/var/www/html/images mediawiki: # Определение сервиса MediaWiki + image: mediawiki:1.35 # Используемый образ MediaWiki версии 1.35 + ports: # Настройка портов + - "8080:80" + containername: mediawiki # Имя контейнера + volumes: # Настройка томов + - mediawiki_data:/var/www/html/images + +``` + +### redmine + +``` + +redmine: # Определение сервиса Redmine + image: redmine:latest # Используемый образ Redmine последней версии + containername: redmine # Имя контейнера + ports: # Настройка портов + - "3000:3000" + volumes: # Настройка томов + - redmine_data:/usr/src/redmine/files + +``` + +# Скрины работы программы: + +Панель консоли +![](lab_1.png "") + +# Видео + +https://vk.com/video230744264_456239102 \ No newline at end of file diff --git a/tukaeva_alfiya_lab_1/docker-compose.yml b/tukaeva_alfiya_lab_1/docker-compose.yml new file mode 100644 index 0000000..681a721 --- /dev/null +++ b/tukaeva_alfiya_lab_1/docker-compose.yml @@ -0,0 +1,53 @@ +services: + mediawiki: # Определение сервиса MediaWiki + image: mediawiki:1.35 # Используемый образ MediaWiki версии 1.35 + ports: # Настройка портов + - "8080:80" + containername: mediawiki # Имя контейнера + volumes: # Настройка томов + - mediawiki_data:/var/www/html/images + + db_wordpress: # Определение сервиса MySQL для WordPress + image: mysql:5.7 # Используемый образ MySQL версии 5.7 + containername: wp_database # Имя контейнера + environment: # Переменные окружения + MYSQLROOTPASSWORD: rootsecret + MYSQLDATABASE: ${DBNAME} + MYSQLUSER: ${DBUSER} + MYSQLPASSWORD: ${DBPASSWORD} + volumes: # Настройка томов + - db_wordpress_data:/var/lib/mysql + + wordpress: # Определение сервиса WordPress + image: wordpress:latest # Используемый образ WordPress последней версии + containername: wp_app # Имя контейнера + restart: always + ports: # Настройка портов + - "8000:80" + user: www-data + environment: # Переменные окружения + WORDPRESSDBHOST: ${DBHOST} + WORDPRESSDBUSER: ${DBUSER} + WORDPRESSDBPASSWORD: ${DBPASSWORD} + WORDPRESSDBNAME: ${DBNAME} + WORDPRESSADMINUSER: admin + WORDPRESSADMINPASSWORD: adminpassword + WORDPRESSADMINEMAIL: admin@example.com + volumes: # Настройка томов + - wordpress_data:/var/www/html + dependson: # Зависимости + - db_wordpress # Зависит от сервиса MySQL + + redmine: # Определение сервиса Redmine + image: redmine:latest # Используемый образ Redmine последней версии + containername: redmine # Имя контейнера + ports: # Настройка портов + - "3000:3000" + volumes: # Настройка томов + - redmine_data:/usr/src/redmine/files + +volumes: # Определение томов + mediawiki_data: # ТОМ для MediaWiki + wordpress_data: # ТОМ для WordPress + db_wordpress_data: # ТОМ для MySQL + redmine_data: # ТОМ для Redmine \ No newline at end of file diff --git a/tukaeva_alfiya_lab_1/entrypoint.sh b/tukaeva_alfiya_lab_1/entrypoint.sh new file mode 100644 index 0000000..4d2aadd --- /dev/null +++ b/tukaeva_alfiya_lab_1/entrypoint.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -e + +# Ожидание готовности базы данных +until wp db check; do + echo "Ожидание базы данных..." + sleep 5 +done + +# Установка WordPress +if ! wp core is-installed; then + wp core install --url="http://localhost:8000" --title="Библиотека" --admin_user="admin" --admin_password="admin_password" --admin_email="admin@example.com" --skip-email +fi + +exec apache2-foreground \ No newline at end of file diff --git a/tukaeva_alfiya_lab_1/lab_1.png b/tukaeva_alfiya_lab_1/lab_1.png new file mode 100644 index 0000000000000000000000000000000000000000..48fbc48f33c7dab4a59bed7dd054c6e35195671c GIT binary patch literal 43986 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 Lb=2}z&_VwMIKg`{ literal 0 HcmV?d00001 From 221f3e248b3bd8978fb3d0b0f3d06825e86eb64d Mon Sep 17 00:00:00 2001 From: mfnefd Date: Wed, 18 Sep 2024 23:53:53 +0400 Subject: [PATCH 7/7] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=201=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- balakhonov_danila_lab_1/README.md | 59 +++++++++++++++++++++ balakhonov_danila_lab_1/docker-compose.yaml | 58 ++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 balakhonov_danila_lab_1/README.md create mode 100644 balakhonov_danila_lab_1/docker-compose.yaml diff --git a/balakhonov_danila_lab_1/README.md b/balakhonov_danila_lab_1/README.md new file mode 100644 index 0000000..fb03807 --- /dev/null +++ b/balakhonov_danila_lab_1/README.md @@ -0,0 +1,59 @@ +# Лабораторная работа номер 1 + +> Здравствуйте меня зовут Балахонов Данила группа ПИбд-42 +> +> *— Балахонов Данила ПИбд-42* + +Видео лабораторной работы номер 1 доступно по этой [ссылке](https://drive.google.com/file/d/1Up_JzDcK_TjYLixpfYXN7PhJmOeg_Uck/view?usp=sharing). + +## Как запустить лабораторную работу номер 1? +### Необходимые компоненты для запуска лабораторной работы номер 1 +> Здесь рассказана установка необходимых компонентов для запуска лабораторной работы номер 1 под дистрибутив GNU/Linux **Ubuntu**. + +Для запуска лабораторной работы номер 1 необходимы такие компоненты: + - Git + - Docker + - Docker compose + +Чтобы установить **Git**, необходимо ввести данные команды в командную строку: +``` bash +sudo apt-get update +sudo apt-get install git +``` + +Чтобы установить **Docker** и **Docker compose**, стоит ввести такие команды: +``` bash +# Настройка репозитория Docker +sudo apt-get update +sudo apt-get install ca-certificates curl +sudo install -m 0755 -d /etc/apt/keyrings +sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc +sudo chmod a+r /etc/apt/keyrings/docker.asc + +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +sudo apt-get update + +# Установка Docker и его компонентов +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +``` +### Запуск лабораторной работы номер 1 +Для запуска лабораторной работы номер 1 необходимо **склонировать** репозиторий в любую папку и **перейти на ветку** balakhonov_danila_lab_1. +Далее в папке с `docker-compose.yaml` нужно вызвать такую команду: +``` bash +sudo docker-compose up -d +``` +Таким образом будут запущены контейнеры в фоновом режиме. +## Какие технологии были использованы? +Для выполнения лабораторной работы номер 1 использовались такие технологии, как: *git*, *docker*, *docker compose*. + +Сервисы, выбранные для запуска в docker-compose файле: + - *Gitea* - удобный сервис отслеживания версий разрабатываемого ПО + - *MediaWiki* - сервис создания и ведения электронной энциклопедии + - *PostgreSQL* - база данных, используемая сервисами выше + +Системой, на которую были установлены указанные технологии, является Ubuntu 22. +## Что делает лабораторная работа номер 1? +Лабораторная работа номер 1 заключается в написании docker-compose файла для удобного запуска и администрирования сразу нескольких сервисов в docker-контейнерах. \ No newline at end of file diff --git a/balakhonov_danila_lab_1/docker-compose.yaml b/balakhonov_danila_lab_1/docker-compose.yaml new file mode 100644 index 0000000..68f242b --- /dev/null +++ b/balakhonov_danila_lab_1/docker-compose.yaml @@ -0,0 +1,58 @@ +services: + # PostgreSQL + db: + # Образ контейнера PostgreSQL последней версии + image: postgres + # Название контейнера + container_name: db + # Переменные окружения для настройки базы данных + environment: + - POSTGRES_USER=gitea + - POSTGRES_PASSWORD=gitea + - POSTGRES_DB=gitea + # Настройка корневого каталога, где хранятся данные + # Слева указан каталог компьютера, справа - каталог контейнера + # Нужно для сохранения данных на сервере после отключения контейнера + volumes: + - ./postgres:/var/lib/postgresql/data + # Порт, через который можно будет подключиться к базе данных + ports: + - 5432:5432 + # После перезапуска докера всегда запускать этот контейнер + restart: always + # Gitea + gitea: + # Используется Gitea последней версии + image: gitea/gitea + container_name: gitea + # После перезапуска докера всегда запускать этот контейнер + restart: always + volumes: + - ./data:/var/lib/gitea + - ./config:/etc/gitea + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + ports: + - 3000:3000 + - 2222:2222 + environment: + - GITEA__database__DB_TYPE=postgres + - GITEA__database__HOST=db:5432 + - GITEA__database__NAME=gitea + - GITEA__database__USER=gitea + - GITEA__database__PASSWD=gitea + # Указывается, что этот контейнер запускается только после запуска контейнера db + depends_on: + - db + # MediaWiki + mediawiki: + # Образ контейнера MediaWiki последней версии + image: mediawiki + container_name: mediawiki + restart: always + ports: + - 8080:80 + links: + - db + volumes: + - ./images:/var/www/html/images \ No newline at end of file