Как получить информацию докера о запуске контейнеров внутри самого контейнера?C#

Место общения программистов C#
Ответить
Anonymous
 Как получить информацию докера о запуске контейнеров внутри самого контейнера?

Сообщение Anonymous »

У меня есть сервер, на котором размещено несколько контейнеров, между ними API и рабочая служба, все они написаны на .NET и помещены в контейнеры в докере, служба использует API, но поскольку я не хочу жестко кодировать порты и IP-адреса, мне нужно программно получать информацию для каждого сеанса каждый раз, когда создается служба, это также поможет узнать, находится ли API в сети, прежде чем пытаться совершать какие-либо вызовы, но я не могу получить эту информацию внутри самого контейнера.когда Выполняя консольное приложение C#, я могу получить нужную мне информацию следующим образом:

Код: Выделить всё

static string ip;
static Dictionary containerPorts = new Dictionary();
static List containerNames = new List();

static void Main()
{
Console.WriteLine("Getting IP...");
ip = GetLocalIpAddress();

string command = string.Concat(" ps --format ", "\"{{.Names}}\"");
RunCommand(command, string.Empty);

foreach (var container in containerNames)
{
string portCommand = string.Concat("inspect -f ", "\"{{range .NetworkSettings.Ports}}{{.}}{{end}}\"", " ", container);
RunCommand(portCommand, container);
}

if (ip != null)
{
foreach (var container in containerPorts)
{
Console.WriteLine($"{container.Key}: {ip}:{container.Value}");
}
}
else
{
Console.WriteLine("Unable to get the IP address of the container.");
}

Console.WriteLine("Please press any key to exit");
Console.ReadLine();
Environment.Exit(0);
}

private static void RunCommand(string command, string containerName)
{
var processInfo = new ProcessStartInfo("docker", $"{command}")
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};

using (var process = Process.Start(processInfo))
{
if (process != null)
{
process.WaitForExit(12000);

var output = process.StandardOutput.ReadToEnd();
process.Close();

if (command.Contains("Ports"))
{
var formattedOutput = Regex.Replace(output, @"[\[\]{}]", "").Split(' ')[1].Trim();
if (string.IsNullOrEmpty(formattedOutput))
{
Console.WriteLine("Unable to get the port of the container");
return;
}
containerPorts[containerName] = formattedOutput;
}
else
{
Console.WriteLine("Getting namesContainer...");
containerNames = output.Split('\n', StringSplitOptions.RemoveEmptyEntries).ToList();
}
}
}
}

private static string GetLocalIpAddress()
{
foreach (var networkInterface in NetworkInterface.GetAllNetworkInterfaces())
{
if (networkInterface.OperationalStatus == OperationalStatus.Up)
{
var ipProperties = networkInterface.GetIPProperties();
foreach (var ipAddress in ipProperties.UnicastAddresses)
{
if (ipAddress.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
return ipAddress.Address.ToString();
}
}
}
}
return null;
}
но при запуске этого кода внутри контейнера он больше не работает, по сути мне нужен ответ «docker ps» в самом контейнере.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ner-itself
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»