Eu tenho a imagem construída assim usando a execução
compilação docker --tag=api --file=Dockerfile_01 --no-cache --progress=plain .
com base no Dockerfile_01 abaixo.
DE mcr.microsoft.com/dotnet/sdk:8.0 COMO build
WORKDIR /bin
COPIAR *.csproj ./
EXECUTAR dotnet restore
COPIAR . ./
EXECUTAR dotnet publish --configuration Release --output /release
DE mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /bin
COPIAR --from=build /release .
EXPOSE 8080 8081
CMD ["dotnet", "Api.dll"]
Eu inicio a execução do meu contêiner
docker run --detach --publish 5001:8080 --publish 7001:8081 --name WebApi api
e parece funcionar, o log me diz que o programa escuta na porta 8080 etc. No entanto, quando navego para http://localhost:5001, recebo 404. Quando disparo diretamente do VS usando o perfil correspondente, consigo ver o Swagger, como esperado.
Como posso solucionar o problema?
A única coisa inesperada que vejo está no log, me dizendo que o redirecionamento para o protocolo seguro falhou devido a alguma confusão nas portas. Esse é um problema de amanhã, no entanto, e tento ir para 5001, que é HTTP, por enquanto.
2025-02-14 17:56:41 info: Microsoft.Hosting.Lifetime[14]
2025-02-14 17:56:41 Agora ouvindo em: http://[::]:8080
2025-02-14 17:56:41 info: Microsoft.Hosting.Lifetime[0]
2025-02-14 17:56:41 Aplicativo iniciado. Pressione Ctrl+C para desligar.
2025-02-14 17:56:41 info: Microsoft.Hosting.Lifetime[0]
2025-02-14 17:56:41 Ambiente de hospedagem: Produção
2025-02-14 17:56:41 info: Microsoft.Hosting.Lifetime[0]
2025-02-14 17:56:41 Caminho raiz do conteúdo: /usr/bin
2025-02-14 17:57:02 warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
2025-02-14 17:57:02 Falha ao determinar a porta https para redirecionamento.
Suspeito que há algo suspeito com a forma como configurei as portas, mas não consigo ver onde. Ele segue a sugestão desta resposta também. Testei várias combinações diferentes, mas não notei nada útil.
Naturalmente, testei / , /swagger e /swagger.html só para ter certeza, embora eu saiba que não é esse o problema.
Se você olhar no seu arquivo Program.cs, verá que o Swagger só é configurado se o aplicativo estiver sendo executado em um ambiente de desenvolvimento. O padrão para aplicativos em contêineres é ser considerado código de produção.
Para que o Swagger esteja disponível, você pode definir ASPNETCORE_ENVIRONMENT como 'Development' no seu comando run como este
Quando você executa seu contêiner no VS, o VS define o ambiente para desenvolvimento, e é por isso que ele funciona a partir daí.