Выполните команду в Docker на Azure с Azure-библиотеки-для-сети - PullRequest
0 голосов
/ 23 ноября 2018

Проблема

Мой вопрос касается отправки команды в Docker-контейнер с C #.В текущем состоянии моей программы команда не выполняется в моем экземпляре докера.Этот док-контейнер работает в Azure.Изображение работает стабильно с экземплярами контейнера объекта.Основой моего образа докера является Ubuntu.Я использую пакеты nuget с именем azure-library-for-net .Создание функции экземпляра Docker работает.Моя программа имеет все учетные данные для аутентификации, что ей нужно.Только если я запускаю функции ExecuteCommmand, тогда я возвращаю ContainerExecResponse со свойством URL-адреса и пароля websocket.Команда не выполняется в моем контейнере, и там ничего не происходит.(Исполнение тоже слишком быстрое, я думаю).Если я запускаю команду вручную в контейнере Docker, то команда работает.

Мой вопрос:

Как мне выполнить команду в Docker, которая работает в Azure с Azure-библиотеки-для-сети?

Контекст
Я хочу изменить пароль для системной учетной записи со случайным паролем в экземпляре Docker.Этот пароль только в памяти моей программы.Когда моей программе больше не нужен докер, тогда моя программа автоматически останавливает экземпляр докера.Последняя функция работает также.

using Microsoft.Azure.Management.ContainerInstance.Fluent;
using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent.Core;

public async Task DeployDocker(string startupCommand, string runningCommand)
{
IAzure azure = Azure.Authenticate(credFile).WithDefaultSubscription();

IResourceGroup resGroup = azure.ResourceGroups.GetByName(DockerSetting.ResourceGroup);
Region azureRegion = resGroup.Region;

string containerName = DockerSetting.ContainerGroup + "-1";

// Create the container group
var containerGroup = azure.ContainerGroups.Define(DockerSetting.ContainerGroup)
          .WithRegion(azureRegion)                                   
          .WithExistingResourceGroup(DockerSetting.ResourceGroup)
             .WithLinux()
             .WithPublicImageRegistryOnly()
             .WithoutVolume()
             .DefineContainerInstance(containerName)
                    .WithImage(DockerSetting.Image)
                    .WithExternalTcpPort(DockerSetting.Port)
                    .WithCpuCoreCount(1.0)
                    .WithMemorySizeInGB(1)
                    .WithStartingCommandLine(startupCommand)
                    .Attach()
                .WithDnsPrefix(DockerSetting.ContainerGroup)
                .Create();

var result = await containerGroup.ExecuteCommandAsync(containerName, runningCommand, runningCommand.Length, 1);
}

Я искал документацию или вопрос по этой проблеме, но не смог найти ни одной.

За исключением: Microsoft Doc - Dotnet экземпляров контейнера

Редактировать:

Когда я передаю эту строку в .WithStartingCommandLine ():

string startupCommand = "/bin/sh -c \"echo 'root:hoi1234!' | chpasswd; /sbin/my_init\"";

Затем я получил эту ошибку обратно:

Ошибка: не удалось запустить контейнер "imago-sp-1": Ошибка ответа от демона: oci ошибка времени выполнения: container_linux.go:247: запуск процесса контейнера вызвал "exec: \" / bin / sh -c \\ "echo 'root: hoi1234!'| chpasswd; / sbin / my_init \\ "\": stat / bin / sh -c \ "echo 'root: hoi1234!'|chpasswd;/ sbin / my_init \ ": нет такого файла или каталога"

Когда я помещаю эту команду в Docker локально, она работает:

docker run -p 26:22 image /bin/sh -c "echo 'root:hoi1234!' | chpasswd; /sbin/my_init"

Редактировать 2: (Мое решение сейчас)

Теперь у меня есть временное решение.Я сделал готовый сценарий оболочки для запуска и дал докеру глобальную переменную для ввода.

Сценарий оболочки:

#!/bin/bash
echo 'root:'${RandomPassword}'' | chpasswd
"/sbin/my_init"

В containergroup я добавил глобальную переменную для сгенерированногопароль и команда запуска будут: /startup.sh Я изменил права на скрипт в Docker с помощью: chmod +x /startup.sh

В своей программе я добавил этот фрагмент кода:

.WithEnvironmentVariable(envName, generatedPassword)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...