Проблема
Мой вопрос касается отправки команды в 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)