У меня есть сервер, на котором размещено несколько контейнеров, между ними API и рабочая служба, все они написаны на .NET и помещены в контейнеры в докере, служба использует API, но поскольку я не хочу жестко кодировать порты и IP-адреса, мне нужно программно получать информацию для каждого сеанса каждый раз, когда создается служба, это также поможет узнать, находится ли API в сети, прежде чем пытаться совершать какие-либо вызовы, но я не могу получить эту информацию внутри самого контейнера.когда Выполняя консольное приложение C#, я могу получить нужную мне информацию следующим образом:
У меня есть сервер, на котором размещено несколько контейнеров, между ними API и рабочая служба, все они написаны на .NET и помещены в контейнеры в докере, служба использует API, но поскольку я не хочу жестко кодировать порты и IP-адреса, мне нужно программно получать информацию для каждого сеанса каждый раз, когда создается служба, это также поможет узнать, находится ли API в сети, прежде чем пытаться совершать какие-либо вызовы, но я не могу получить эту информацию внутри самого контейнера.когда Выполняя консольное приложение C#, я могу получить нужную мне информацию следующим образом: [code]static string ip; static Dictionary containerPorts = new Dictionary(); static List containerNames = new List();
static void Main() { Console.WriteLine("Getting IP..."); ip = GetLocalIpAddress();
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); }
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; } [/code] но при запуске этого кода внутри контейнера он больше не работает, по сути мне нужен ответ «docker ps» в самом контейнере.