FF-1914: New docker plugin

This commit is contained in:
John Andrews
2024-11-04 08:59:09 +13:00
parent 67a4c67be3
commit 8442379c3d
17 changed files with 742 additions and 0 deletions

81
Docker/Docker.csproj Normal file
View File

@@ -0,0 +1,81 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RootNamespace>FileFlows.Docker</RootNamespace>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
<FileVersion>1.1.1.528</FileVersion>
<ProductVersion>1.1.1.528</ProductVersion>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<Company>FileFlows</Company>
<Authors>John Andrews</Authors>
<Product>Audio</Product>
<PackageProjectUrl>https://fileflows.com/</PackageProjectUrl>
<Description>Flow elements for interacting with Docker.</Description>
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
<ParallelizeAssemblies>true</ParallelizeAssemblies>
<MaxParallelThreads>4</MaxParallelThreads>
</PropertyGroup>
<ItemGroup Condition=" '$(Configuration)' == 'Debug'">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.4.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.4.3" />
<PackageReference Include="Moq" Version="4.20.70" />
<ProjectReference Include="..\PluginTestLibrary\PluginTestLibrary.csproj" />
<Content Include="Tests\Resources\**\*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Reference Include="Plugin">
<HintPath>..\FileFlows.Plugin.dll</HintPath>
<SpecificVersion>False</SpecificVersion>
</Reference>
</ItemGroup>
<ItemGroup>
<None Update="i18n\en.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\fr.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\ja.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\de.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\sv.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\zh.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\it.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\zht.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\ru.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\pt.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\nl.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\ko.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="i18n\es.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,154 @@
using System.ComponentModel.DataAnnotations;
using System.Text;
using FileFlows.Plugin;
using FileFlows.Plugin.Attributes;
namespace FileFlows.Docker.FlowElements;
/// <summary>
/// Flow element that executes a Docker command
/// </summary>
public class DockerExecute: Node
{
/// <inheritdoc />
public override int Inputs => 1;
/// <inheritdoc />
public override int Outputs => AdditionalOutputs?.Any() == true ? (1 + AdditionalOutputs.Count) : 1;
/// <inheritdoc />
public override FlowElementType Type => FlowElementType.Process;
/// <inheritdoc />
public override string Icon => "fab fa-docker";
/// <inheritdoc />
public override string HelpUrl => "https://fileflows.com/docs/plugins/basic-nodes/docker-execute";
/// <summary>
/// Gets or sets the name of the docker image
/// </summary>
[Required]
[TextVariable(1)]
public string Image { get; set; } = string.Empty;
/// <summary>
/// Gets or sets volumes
/// </summary>
[KeyValue(2, null)]
[Required]
public List<KeyValuePair<string, string>> Volumes { get; set; } = [];
/// <summary>
/// Gets or sets additional outputs
/// </summary>
[KeyValue(3, null)]
[Required]
public List<string> AdditionalOutputs { get; set; } = [];
/// <summary>
/// Gets or sets the docker command
/// </summary>
[Required]
[TextVariable(3)]
public string Command { get; set; } = string.Empty;
/// <inheritdoc />
public override int Execute(NodeParameters args)
{
var command = args.ReplaceVariables(Command, stripMissing: true);
command = command.Replace(args.TempPath, "/temp");
string image = args.ReplaceVariables(Image, stripMissing: true);
args.Logger?.ILog("Image: " + image);
args.Logger?.ILog("Command: " + command);
List<string> arguments =
[
"run",
"--rm"
];
foreach (var vol in Volumes ?? [])
{
arguments.AddRange(["-v", vol.Key.Trim() + ":" + vol.Value.Trim() ]);
}
arguments.AddRange(["-v", $"{args.TempPathHost}:/temp"]);
arguments.Add(image);
// Split the command string into individual arguments, considering quotes
var commandArguments = SplitCommand(command)?.ToArray() ?? [];
if (commandArguments.Length > 0)
{
arguments.AddRange(commandArguments);
foreach (var arg in commandArguments)
{
args.Logger?.ILog("Arg: " + arg);
}
}
var result = args.Execute(new()
{
Command = command,
ArgumentList = arguments.ToArray()
});
if (AdditionalOutputs?.Any() == true)
{
for (int i = 0; i < AdditionalOutputs.Count;i++)
{
var text = args.ReplaceVariables(AdditionalOutputs[i], stripMissing: true);
if (args.StringHelper.Matches(text, result.StandardOutput)
|| args.StringHelper.Matches(text, result.StandardError))
{
// + 2 since outputs are 1 based, and these are additional so above the standard 1 output
args.Logger?.ILog($"Additional output[{i + 2}] detected: {text}");
return i + 2;
}
}
}
args.Logger?.ILog("Exit Code: " + result.ExitCode);
if (result.ExitCode != 0)
{
args.FailureReason = "Invalid exit code received: " + result.ExitCode;
args.Logger?.ELog(args.FailureReason);
return -1;
}
args.Logger?.ILog("Success exit code received");
return 1;
}
/// <summary>
/// Splits a command string into a list of arguments, handling quoted segments correctly.
/// </summary>
private static IEnumerable<string> SplitCommand(string command)
{
var args = new List<string>();
var currentArg = new StringBuilder();
bool inQuotes = false;
foreach (char c in command)
{
if (c == '\"')
{
inQuotes = !inQuotes;
}
else if (c == ' ' && !inQuotes)
{
if (currentArg.Length > 0)
{
args.Add(currentArg.ToString());
currentArg.Clear();
}
}
else
{
currentArg.Append(c);
}
}
if (currentArg.Length > 0)
{
args.Add(currentArg.ToString());
}
return args;
}
}

20
Docker/Plugin.cs Normal file
View File

@@ -0,0 +1,20 @@
namespace FileFlows.Docker;
/// <summary>
/// Plugin Info
/// </summary>
public class Plugin : FileFlows.Plugin.IPlugin
{
/// <inheritdoc />
public Guid Uid => new Guid("1df9239a-3ce5-44b1-9113-3cdcae980a69");
/// <inheritdoc />
public string Name => "Docker";
/// <inheritdoc />
public string MinimumVersion => "1.0.4.2019";
/// <inheritdoc />
public string Icon => "fab fa-docker";
/// <inheritdoc />
public void Init() { }
}

37
Docker/i18n/de.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "Startet einen Docker-Container aus einem Image und führt darin einen angegebenen Befehl aus.",
"Fields": {
"Message": "Docker-Image",
"Image-Help": "Der Name des Docker-Images, das ausgeführt werden soll. Dieses Image wird heruntergeladen, falls es lokal noch nicht verfügbar ist.",
"Volumes": "Volume-Zuordnungen",
"Volumes-Help": "Geben Sie Volumes an, die in den Container gemappt werden sollen. Der temporäre Pfad wird automatisch zu `/temp` im Container gemappt.",
"AdditionalOutputs": "Zusätzliche Ausgaben",
"AdditionalOutputs-Help": "Eine indizierte Liste zusätzlicher erwarteter Ausgaben der Befehlsausführung, um sie mit der Ausgabe für benutzerdefinierte Verarbeitung abzugleichen.",
"Command": "Befehl",
"Command-Help": "Der spezifische Befehl, der im Docker-Container ausgeführt werden soll."
},
"Outputs": {
"1": "Befehl erfolgreich ausgeführt",
"2": "Benutzerdefinierte Ausgabe 1",
"3": "Benutzerdefinierte Ausgabe 2",
"4": "Benutzerdefinierte Ausgabe 3",
"5": "Benutzerdefinierte Ausgabe 4",
"6": "Benutzerdefinierte Ausgabe 5",
"7": "Benutzerdefinierte Ausgabe 6",
"8": "Benutzerdefinierte Ausgabe 7",
"9": "Benutzerdefinierte Ausgabe 8",
"10": "Benutzerdefinierte Ausgabe 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "Ein Plugin, das mit Docker interagiert, um flexible Integration, Interaktion und Verwaltung von Docker-Ressourcen und -Prozessen zu ermöglichen.",
"Label": "Docker"
}
}
}

37
Docker/i18n/en.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "Launches a Docker container from an image and executes a specified command inside it.",
"Fields": {
"Message": "Docker Image",
"Image-Help": "The name of the Docker image to execute. This image will be pulled if not already available locally.",
"Volumes": "Volume Mappings",
"Volumes-Help": "Specify volumes to map into the container. The temporary path will automatically map to `/temp` inside the container.",
"AdditionalOutputs": "Additional Outputs",
"AdditionalOutputs-Help": "An indexed list of additional expected outputs from the command execution, to match against output for custom processing.",
"Command": "Command",
"Command-Help": "The specific command to run within the Docker container."
},
"Outputs": {
"1": "Command executed successfully",
"2": "Custom Output 1",
"3": "Custom Output 2",
"4": "Custom Output 3",
"5": "Custom Output 4",
"6": "Custom Output 5",
"7": "Custom Output 6",
"8": "Custom Output 7",
"9": "Custom Output 8",
"10": "Custom Output 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "A plugin that interfaces with Docker to enable flexible integration, interaction, and management of Docker resources and processes.",
"Label": "Docker"
}
}
}

37
Docker/i18n/es.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "Inicia un contenedor Docker a partir de una imagen y ejecuta un comando específico en él.",
"Fields": {
"Message": "Imagen de Docker",
"Image-Help": "El nombre de la imagen de Docker a ejecutar. Esta imagen se descargará si no está disponible localmente.",
"Volumes": "Mapeo de Volúmenes",
"Volumes-Help": "Especifique volúmenes para mapear en el contenedor. La ruta temporal se asignará automáticamente a `/temp` dentro del contenedor.",
"AdditionalOutputs": "Salidas Adicionales",
"AdditionalOutputs-Help": "Una lista indexada de salidas adicionales esperadas de la ejecución del comando, para hacer coincidir con la salida para procesamiento personalizado.",
"Command": "Comando",
"Command-Help": "El comando específico que se ejecutará dentro del contenedor Docker."
},
"Outputs": {
"1": "Comando ejecutado con éxito",
"2": "Salida Personalizada 1",
"3": "Salida Personalizada 2",
"4": "Salida Personalizada 3",
"5": "Salida Personalizada 4",
"6": "Salida Personalizada 5",
"7": "Salida Personalizada 6",
"8": "Salida Personalizada 7",
"9": "Salida Personalizada 8",
"10": "Salida Personalizada 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "Un plugin que interactúa con Docker para permitir una integración, interacción y gestión flexible de recursos y procesos de Docker.",
"Label": "Docker"
}
}
}

37
Docker/i18n/fr.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "Lance un conteneur Docker à partir d'une image et exécute une commande spécifiée à l'intérieur.",
"Fields": {
"Message": "Image Docker",
"Image-Help": "Le nom de l'image Docker à exécuter. Cette image sera téléchargée si elle n'est pas déjà disponible localement.",
"Volumes": "Mappages de Volumes",
"Volumes-Help": "Spécifiez les volumes à mapper dans le conteneur. Le chemin temporaire sera automatiquement mappé à `/temp` dans le conteneur.",
"AdditionalOutputs": "Sorties Additionnelles",
"AdditionalOutputs-Help": "Une liste indexée de sorties supplémentaires attendues de l'exécution de la commande, pour faire correspondre avec la sortie pour un traitement personnalisé.",
"Command": "Commande",
"Command-Help": "La commande spécifique à exécuter dans le conteneur Docker."
},
"Outputs": {
"1": "Commande exécutée avec succès",
"2": "Sortie Personnalisée 1",
"3": "Sortie Personnalisée 2",
"4": "Sortie Personnalisée 3",
"5": "Sortie Personnalisée 4",
"6": "Sortie Personnalisée 5",
"7": "Sortie Personnalisée 6",
"8": "Sortie Personnalisée 7",
"9": "Sortie Personnalisée 8",
"10": "Sortie Personnalisée 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "Un plugin qui interagit avec Docker pour permettre une intégration, une interaction et une gestion flexibles des ressources et des processus Docker.",
"Label": "Docker"
}
}
}

37
Docker/i18n/it.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "Avvia un contenitore Docker da un'immagine ed esegue un comando specificato al suo interno.",
"Fields": {
"Message": "Immagine Docker",
"Image-Help": "Il nome dell'immagine Docker da eseguire. Questa immagine verrà scaricata se non è già disponibile localmente.",
"Volumes": "Mappatura Volumi",
"Volumes-Help": "Specifica i volumi da mappare nel contenitore. Il percorso temporaneo verrà automaticamente mappato su `/temp` all'interno del contenitore.",
"AdditionalOutputs": "Output Aggiuntivi",
"AdditionalOutputs-Help": "Un elenco indicizzato di output aggiuntivi attesi dall'esecuzione del comando, per corrispondere all'output per l'elaborazione personalizzata.",
"Command": "Comando",
"Command-Help": "Il comando specifico da eseguire all'interno del contenitore Docker."
},
"Outputs": {
"1": "Comando eseguito con successo",
"2": "Output Personalizzato 1",
"3": "Output Personalizzato 2",
"4": "Output Personalizzato 3",
"5": "Output Personalizzato 4",
"6": "Output Personalizzato 5",
"7": "Output Personalizzato 6",
"8": "Output Personalizzato 7",
"9": "Output Personalizzato 8",
"10": "Output Personalizzato 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "Un plugin che interagisce con Docker per consentire una gestione, un'integrazione e un'interazione flessibili delle risorse e dei processi Docker.",
"Label": "Docker"
}
}
}

37
Docker/i18n/ja.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "イメージからDockerコンテナを起動し、指定されたコマンドを実行します。",
"Fields": {
"Message": "Dockerイメージ",
"Image-Help": "実行するDockerイメージの名前。このイメージがローカルに存在しない場合、自動的にダウンロードされます。",
"Volumes": "ボリュームマッピング",
"Volumes-Help": "コンテナにマップするボリュームを指定してください。一時パスはコンテナ内で`/temp`に自動的にマップされます。",
"AdditionalOutputs": "追加出力",
"AdditionalOutputs-Help": "コマンド実行から期待される追加出力のインデックス付きリストで、カスタム処理のために出力と一致させます。",
"Command": "コマンド",
"Command-Help": "Dockerコンテナ内で実行する特定のコマンド。"
},
"Outputs": {
"1": "コマンドが正常に実行されました",
"2": "カスタム出力 1",
"3": "カスタム出力 2",
"4": "カスタム出力 3",
"5": "カスタム出力 4",
"6": "カスタム出力 5",
"7": "カスタム出力 6",
"8": "カスタム出力 7",
"9": "カスタム出力 8",
"10": "カスタム出力 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "Dockerリソースとプロセスの柔軟な統合、操作、および管理を可能にするDockerインターフェースプラグイン。",
"Label": "Docker"
}
}
}

37
Docker/i18n/ko.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "이미지에서 Docker 컨테이너를 시작하고 지정된 명령을 실행합니다.",
"Fields": {
"Message": "Docker 이미지",
"Image-Help": "실행할 Docker 이미지의 이름입니다. 이 이미지가 로컬에 없으면 자동으로 다운로드됩니다.",
"Volumes": "볼륨 매핑",
"Volumes-Help": "컨테이너에 매핑할 볼륨을 지정하세요. 임시 경로는 컨테이너 내부에서 `/temp`로 자동 매핑됩니다.",
"AdditionalOutputs": "추가 출력",
"AdditionalOutputs-Help": "명령 실행의 추가 예상 출력을 위한 인덱스 리스트로, 출력과 일치시켜 사용자 지정 처리를 수행합니다.",
"Command": "명령",
"Command-Help": "Docker 컨테이너 내부에서 실행할 특정 명령입니다."
},
"Outputs": {
"1": "명령이 성공적으로 실행됨",
"2": "사용자 정의 출력 1",
"3": "사용자 정의 출력 2",
"4": "사용자 정의 출력 3",
"5": "사용자 정의 출력 4",
"6": "사용자 정의 출력 5",
"7": "사용자 정의 출력 6",
"8": "사용자 정의 출력 7",
"9": "사용자 정의 출력 8",
"10": "사용자 정의 출력 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "Docker 리소스와 프로세스의 유연한 통합, 상호 작용 및 관리를 가능하게 하는 플러그인입니다.",
"Label": "Docker"
}
}
}

37
Docker/i18n/nl.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "Start een Docker-container vanuit een image en voert een opgegeven opdracht uit.",
"Fields": {
"Message": "Docker-afbeelding",
"Image-Help": "De naam van de Docker-afbeelding om uit te voeren. Deze afbeelding wordt gedownload als deze niet lokaal beschikbaar is.",
"Volumes": "Volume-mapping",
"Volumes-Help": "Geef volumes op die in de container moeten worden gemapt. Het tijdelijke pad wordt automatisch naar `/temp` in de container gemapt.",
"AdditionalOutputs": "Aanvullende uitvoer",
"AdditionalOutputs-Help": "Een geïndexeerde lijst van extra verwachte uitvoer van de opdrachtuitvoering, om te koppelen aan uitvoer voor aangepaste verwerking.",
"Command": "Opdracht",
"Command-Help": "De specifieke opdracht die in de Docker-container moet worden uitgevoerd."
},
"Outputs": {
"1": "Opdracht succesvol uitgevoerd",
"2": "Aangepaste uitvoer 1",
"3": "Aangepaste uitvoer 2",
"4": "Aangepaste uitvoer 3",
"5": "Aangepaste uitvoer 4",
"6": "Aangepaste uitvoer 5",
"7": "Aangepaste uitvoer 6",
"8": "Aangepaste uitvoer 7",
"9": "Aangepaste uitvoer 8",
"10": "Aangepaste uitvoer 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "Een plug-in die interactie met Docker mogelijk maakt voor flexibele integratie, interactie en beheer van Docker-bronnen en processen.",
"Label": "Docker"
}
}
}

37
Docker/i18n/pt.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "Inicia um contêiner Docker a partir de uma imagem e executa um comando especificado dentro dele.",
"Fields": {
"Message": "Imagem Docker",
"Image-Help": "O nome da imagem Docker a ser executada. Esta imagem será baixada se não estiver disponível localmente.",
"Volumes": "Mapeamento de Volumes",
"Volumes-Help": "Especifique volumes a serem mapeados para o contêiner. O caminho temporário será mapeado automaticamente para `/temp` dentro do contêiner.",
"AdditionalOutputs": "Saídas Adicionais",
"AdditionalOutputs-Help": "Uma lista indexada de saídas adicionais esperadas da execução do comando, para correspondência de saída para processamento personalizado.",
"Command": "Comando",
"Command-Help": "O comando específico a ser executado dentro do contêiner Docker."
},
"Outputs": {
"1": "Comando executado com sucesso",
"2": "Saída personalizada 1",
"3": "Saída personalizada 2",
"4": "Saída personalizada 3",
"5": "Saída personalizada 4",
"6": "Saída personalizada 5",
"7": "Saída personalizada 6",
"8": "Saída personalizada 7",
"9": "Saída personalizada 8",
"10": "Saída personalizada 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "Um plugin que permite interação com o Docker para integração, interação e gerenciamento flexíveis de recursos e processos Docker.",
"Label": "Docker"
}
}
}

37
Docker/i18n/ru.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "Запускает контейнер Docker из образа и выполняет в нем заданную команду.",
"Fields": {
"Message": "Docker-образ",
"Image-Help": "Имя Docker-образа для выполнения. Этот образ будет загружен, если он не доступен локально.",
"Volumes": "Привязка томов",
"Volumes-Help": "Укажите тома для маппинга в контейнер. Временный путь будет автоматически сопоставлен с `/temp` в контейнере.",
"AdditionalOutputs": "Дополнительные выходные данные",
"AdditionalOutputs-Help": "Индексированный список дополнительных ожидаемых выходных данных от выполнения команды, для сопоставления с выводом для пользовательской обработки.",
"Command": "Команда",
"Command-Help": "Конкретная команда для выполнения внутри контейнера Docker."
},
"Outputs": {
"1": "Команда успешно выполнена",
"2": "Пользовательский вывод 1",
"3": "Пользовательский вывод 2",
"4": "Пользовательский вывод 3",
"5": "Пользовательский вывод 4",
"6": "Пользовательский вывод 5",
"7": "Пользовательский вывод 6",
"8": "Пользовательский вывод 7",
"9": "Пользовательский вывод 8",
"10": "Пользовательский вывод 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "Плагин, который взаимодействует с Docker для обеспечения гибкой интеграции, взаимодействия и управления ресурсами и процессами Docker.",
"Label": "Docker"
}
}
}

37
Docker/i18n/sv.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "Startar en Docker-container från en bild och kör ett specificerat kommando inuti den.",
"Fields": {
"Message": "Dockerbild",
"Image-Help": "Namnet på Docker-bilden som ska köras. Denna bild kommer att hämtas om den inte redan finns lokalt.",
"Volumes": "Volymkartläggningar",
"Volumes-Help": "Ange volymer som ska mappas till containern. Den temporära sökvägen kommer automatiskt att mappas till `/temp` inuti containern.",
"AdditionalOutputs": "Ytterligare utdata",
"AdditionalOutputs-Help": "En indexerad lista över ytterligare förväntade utdata från kommandokörningen, för att matcha mot utdata för anpassad bearbetning.",
"Command": "Kommando",
"Command-Help": "Det specifika kommandot som ska köras i Docker-containern."
},
"Outputs": {
"1": "Kommandot utfördes framgångsrikt",
"2": "Anpassad utdata 1",
"3": "Anpassad utdata 2",
"4": "Anpassad utdata 3",
"5": "Anpassad utdata 4",
"6": "Anpassad utdata 5",
"7": "Anpassad utdata 6",
"8": "Anpassad utdata 7",
"9": "Anpassad utdata 8",
"10": "Anpassad utdata 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "En plugin som interagerar med Docker för att möjliggöra flexibel integration, interaktion och hantering av Docker-resurser och processer.",
"Label": "Docker"
}
}
}

37
Docker/i18n/zh.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "从镜像启动Docker容器并在其中执行指定的命令。",
"Fields": {
"Message": "Docker镜像",
"Image-Help": "要执行的Docker镜像的名称。如果该镜像在本地不存在将自动下载该镜像。",
"Volumes": "卷映射",
"Volumes-Help": "指定要映射到容器的卷。临时路径将自动映射到容器内部的`/temp`。",
"AdditionalOutputs": "额外输出",
"AdditionalOutputs-Help": "命令执行的额外预期输出的索引列表,以便与输出匹配以进行自定义处理。",
"Command": "命令",
"Command-Help": "要在Docker容器内运行的具体命令。"
},
"Outputs": {
"1": "命令成功执行",
"2": "自定义输出 1",
"3": "自定义输出 2",
"4": "自定义输出 3",
"5": "自定义输出 4",
"6": "自定义输出 5",
"7": "自定义输出 6",
"8": "自定义输出 7",
"9": "自定义输出 8",
"10": "自定义输出 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "一个与Docker交互的插件以实现Docker资源和过程的灵活集成、交互和管理。",
"Label": "Docker"
}
}
}

37
Docker/i18n/zht.json Normal file
View File

@@ -0,0 +1,37 @@
{
"Flow": {
"Parts": {
"DockerExecute": {
"Description": "從映像啟動Docker容器並在其中執行指定的命令。",
"Fields": {
"Message": "Docker映像",
"Image-Help": "要執行的Docker映像的名稱。如果該映像在本地不存在將自動下載該映像。",
"Volumes": "卷映射",
"Volumes-Help": "指定要映射到容器的卷。臨時路徑將自動映射到容器內部的`/temp`。",
"AdditionalOutputs": "額外輸出",
"AdditionalOutputs-Help": "命令執行的額外預期輸出的索引列表,以便與輸出匹配以進行自定義處理。",
"Command": "命令",
"Command-Help": "要在Docker容器內運行的具體命令。"
},
"Outputs": {
"1": "命令成功執行",
"2": "自定義輸出 1",
"3": "自定義輸出 2",
"4": "自定義輸出 3",
"5": "自定義輸出 4",
"6": "自定義輸出 5",
"7": "自定義輸出 6",
"8": "自定義輸出 7",
"9": "自定義輸出 8",
"10": "自定義輸出 9"
}
}
}
},
"Plugins": {
"Docker": {
"Description": "一個與Docker互動的插件以實現Docker資源和過程的靈活整合、互動和管理。",
"Label": "Docker"
}
}
}

View File

@@ -41,6 +41,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nextcloud", "Nextcloud\Next
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginTestLibrary", "PluginTestLibrary\PluginTestLibrary.csproj", "{3D9F9D89-1860-48D9-9CCC-646EFF2F3C25}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Docker", "Docker\Docker.csproj", "{2E26B8A7-269B-4E0C-A4D6-936B6FEC01F5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -123,6 +125,10 @@ Global
{3D9F9D89-1860-48D9-9CCC-646EFF2F3C25}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3D9F9D89-1860-48D9-9CCC-646EFF2F3C25}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3D9F9D89-1860-48D9-9CCC-646EFF2F3C25}.Release|Any CPU.Build.0 = Release|Any CPU
{2E26B8A7-269B-4E0C-A4D6-936B6FEC01F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2E26B8A7-269B-4E0C-A4D6-936B6FEC01F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2E26B8A7-269B-4E0C-A4D6-936B6FEC01F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2E26B8A7-269B-4E0C-A4D6-936B6FEC01F5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE