Browse Source

Respect configured host in bindings (#1268)

* Respect configured host in bindings

When setting ASPNETCORE_URLS env variable in ProcessRunner. This makes
it possible to override which interface to bind to and also allow
connections from anywhere by using a wildcard.

* Respect binding host for Docker containers.

* Updates per PR feedback.

Co-authored-by: phoff <phoff@microsoft.com>
main-publicPoolNames
Vegard Løkken 5 years ago
committed by GitHub
parent
commit
bd63c2b0f6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      src/Microsoft.Tye.Hosting/DockerRunner.cs
  2. 13
      src/Microsoft.Tye.Hosting/ProcessRunner.cs

10
src/Microsoft.Tye.Hosting/DockerRunner.cs

@ -215,7 +215,7 @@ namespace Microsoft.Tye.Hosting
var dockerImage = docker.Image ?? service.Description.Name;
async Task RunDockerContainer(IEnumerable<(int ExternalPort, int Port, int? ContainerPort, string? Protocol)> ports, CancellationToken cancellationToken)
async Task RunDockerContainer(IEnumerable<(int ExternalPort, int Port, int? ContainerPort, string? Protocol, string? Host)> ports, CancellationToken cancellationToken)
{
var hasPorts = ports.Any();
@ -237,7 +237,7 @@ namespace Microsoft.Tye.Hosting
// These are the ports that the application should use for binding
// 1. Tell the docker container what port to bind to
portString = docker.Private ? "" : string.Join(" ", ports.Select(p => $"-p {p.Port}:{p.ContainerPort ?? p.Port}{(string.Equals(p.Protocol, "udp", StringComparison.OrdinalIgnoreCase) ? "/udp" : string.Empty)}"));
portString = docker.Private ? "" : string.Join(" ", ports.Select(p => $"-p {(!string.IsNullOrWhiteSpace(p.Host) ? $"{p.Host}:" : string.Empty)}{p.Port}:{p.ContainerPort ?? p.Port}{(string.Equals(p.Protocol, "udp", StringComparison.OrdinalIgnoreCase) ? "/udp" : string.Empty)}"));
if (docker.IsAspNet)
{
@ -511,7 +511,7 @@ namespace Microsoft.Tye.Hosting
// port
for (var i = 0; i < serviceDescription.Replicas; i++)
{
var ports = new List<(int, int, int?, string?)>();
var ports = new List<(int, int, int?, string?, string?)>();
foreach (var binding in serviceDescription.Bindings)
{
if (binding.Port == null)
@ -519,7 +519,7 @@ namespace Microsoft.Tye.Hosting
continue;
}
ports.Add((binding.Port.Value, binding.ReplicaPorts[i], binding.ContainerPort, binding.Protocol));
ports.Add((binding.Port.Value, binding.ReplicaPorts[i], binding.ContainerPort, binding.Protocol, binding.Host));
}
tasks[i] = RunDockerContainer(ports, cancellationToken);
@ -529,7 +529,7 @@ namespace Microsoft.Tye.Hosting
{
for (var i = 0; i < service.Description.Replicas; i++)
{
tasks[i] = RunDockerContainer(Enumerable.Empty<(int, int, int?, string?)>(), cancellationToken);
tasks[i] = RunDockerContainer(Enumerable.Empty<(int, int, int?, string?, string?)>(), cancellationToken);
}
}

13
src/Microsoft.Tye.Hosting/ProcessRunner.cs

@ -181,7 +181,7 @@ namespace Microsoft.Tye.Hosting
var path = service.Status.ExecutablePath!;
var workingDirectory = service.Status.WorkingDirectory!;
async Task RunApplicationAsync(IEnumerable<(int ExternalPort, int Port, string? Protocol)> ports, string copiedArgs)
async Task RunApplicationAsync(IEnumerable<(int ExternalPort, int Port, string? Protocol, string? Host)> ports, string copiedArgs)
{
// Make sure we yield before trying to start the process, this is important so we don't block startup
await Task.Yield();
@ -221,7 +221,7 @@ namespace Microsoft.Tye.Hosting
// 1. Configure ASP.NET Core to bind to those same ports
var urlPorts = ports.Where(p => p.Protocol == null || p.Protocol == "http" || p.Protocol == "https");
environment["ASPNETCORE_URLS"] = string.Join(";", urlPorts.Select(p => $"{p.Protocol ?? "http"}://{application.ContainerEngine.AspNetUrlsHost}:{p.Port}"));
environment["ASPNETCORE_URLS"] = string.Join(";", urlPorts.Select(p => $"{p.Protocol ?? "http"}://{p.Host ?? application.ContainerEngine.AspNetUrlsHost}:{p.Port}"));
// Set the HTTPS port for the redirect middleware
foreach (var p in ports)
@ -304,7 +304,8 @@ namespace Microsoft.Tye.Hosting
{
if (hasPorts)
{
_logger.LogInformation("{ServiceName} running on process id {PID} bound to {Address}", replica, pid, string.Join(", ", ports.Select(p => $"{p.Protocol ?? "http"}://localhost:{p.Port}")));
_logger.LogInformation("{ServiceName} running on process id {PID} bound to {Address}",
replica, pid, string.Join(", ", ports.Select(p => $"{p.Protocol ?? "http"}://{p.Host ?? application.ContainerEngine.AspNetUrlsHost}:{p.Port}")));
}
else
{
@ -429,7 +430,7 @@ namespace Microsoft.Tye.Hosting
// port
for (int i = 0; i < serviceDescription.Replicas; i++)
{
var ports = new List<(int, int, string?)>();
var ports = new List<(int, int, string?, string?)>();
foreach (var binding in serviceDescription.Bindings)
{
if (binding.Port == null)
@ -437,7 +438,7 @@ namespace Microsoft.Tye.Hosting
continue;
}
ports.Add((binding.Port.Value, binding.ReplicaPorts[i], binding.Protocol));
ports.Add((binding.Port.Value, binding.ReplicaPorts[i], binding.Protocol, binding.Host));
}
processInfo.Tasks[i] = RunApplicationAsync(ports, args);
@ -447,7 +448,7 @@ namespace Microsoft.Tye.Hosting
{
for (int i = 0; i < service.Description.Replicas; i++)
{
processInfo.Tasks[i] = RunApplicationAsync(Enumerable.Empty<(int, int, string?)>(), args);
processInfo.Tasks[i] = RunApplicationAsync(Enumerable.Empty<(int, int, string?, string?)>(), args);
}
}

Loading…
Cancel
Save