【发布时间】:2021-08-13 17:18:52
【问题描述】:
我有在本地工作的时间触发功能。我将解决方案构建到一个 docker 容器中。当我在本地启动图像时,它再次工作,但是当我在 windows server 2019 上启动图像时,我收到此错误:
Microsoft.Azure.WebJobs.Host.Listeners.FunctionListenerException: The listener for function 'PlayerSummary' was unable to start.
---> Microsoft.Azure.Storage.StorageException: Name or service not known
---> System.Net.Http.HttpRequestException: Name or service not known
---> System.Net.Sockets.SocketException (0xFFFDFFFF): Name or service not known
at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToke
n)
at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancell
ationToken)
at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boo
lean disposeCts)
at Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteAsync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationC
ontext, CancellationToken token)
--- End of inner exception stack trace ---
at Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteAsync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationC
ontext, CancellationToken token)
at Microsoft.Azure.WebJobs.Host.StorageBaseDistributedLockManager.TryAcquireLeaseAsync(CloudBlockBlob blob, TimeSpan leasePeriod, Str
ing proposedLeaseId, CancellationToken cancellationToken) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host.Storag
e\Singleton\BlobLeaseDistributedLockManager.cs:line 133
at Microsoft.Azure.WebJobs.Host.StorageBaseDistributedLockManager.TryLockAsync(String account, String lockId, String lockOwnerId, Str
ing proposedLeaseId, TimeSpan lockPeriod, CancellationToken cancellationToken) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azur
e.WebJobs.Host.Storage\Singleton\BlobLeaseDistributedLockManager.cs:line 84
at Microsoft.Azure.WebJobs.Host.SingletonManager.TryLockAsync(String lockId, String functionInstanceId, SingletonAttribute attribute,
CancellationToken cancellationToken, Boolean retry) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Singleton\S
ingletonManager.cs:line 113
我的函数调用如下所示:
[FunctionName(nameof(PlayerSummary))]
public async Task PlayerSummary([TimerTrigger("*/15 * * * *")] TimerInfo myTimer,
ILogger logger)
{
var endpoint = "https://example.com";
var start = DateTime.UtcNow;
var date = start.ToString(Format);
var body = JsonConvert.SerializeObject(new Request
{
DateStart = date,
DateEnd = date,
WhiteLabels = [1, 2]
});
var request = new StringContent(
body,
Encoding.UTF8,
"application/json");
var responseBody = string.Empty;
try
{
var response = await _client.PostAsync(endpoint, request);
responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
var resultSet = JsonConvert.DeserializeObject<PlayerSummary[]>(responseBody);
await _context.PlayerSummaries.AddOrUpdatePlayerAsync(resultSet);
await _context.SaveChangesAsync();
await _monitor.LogInfo(nameof(PlayerSummary), responseBody, start, DateTime.UtcNow);
}
else
{
await _monitor.LogWarning(nameof(PlayerSummary), body, responseBody, start, DateTime.UtcNow);
}
}
catch (Exception e)
{
await _monitor.LogError(nameof(PlayerSummary), body, responseBody, start, e, e.Message);
logger.LogError($"{nameof(PlayerSummary)} ERROR at {DateTime.UtcNow}: {e.Message}");
}
logger.LogInformation($"{nameof(PlayerSummary)} executed at: {DateTime.Now}");
}
我的 Dockerfile 如下所示:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS installer-env
COPY . /src/ProgressPlay
RUN cd /src/ProgressPlay && \
mkdir -p /home/site/wwwroot && \
dotnet publish *.csproj --output /home/site/wwwroot
# To enable ssh & remote debugging on app service change the base image to the one below
# FROM mcr.microsoft.com/azure-functions/dotnet:3.0-appservice
FROM mcr.microsoft.com/azure-functions/dotnet:3.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureWebJobsStorage="UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://host.docker.internal" \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
【问题讨论】: