#c# #asp.net-core #docker-compose #dockerfile
Вопрос:
доброе утро,
Я новичок в docker и просматриваю документацию и видеоролики Pluralsight. У меня есть действительно простой API, который я практикую/учусь запускать в качестве контейнера docker. Все строится и запускается, но не отвечает на запрос почтальона.
Однако, когда я запускаю проект в VS 2019, он отвечает почтальону?
Docker desktop 4.X Контейнеры Linux ПРОТИВ 2019
API
[HttpGet("basic")]
[AllowAnonymous]
public IActionResult Basic()
{
return Ok("Alive");
}
почтальон
ПОЛУЧИТЬ http://localhost:5150/HealthCheck/basic
докер сочиняет
version: "3"
services:
api:
#snipped container name etc for brevity
ports:
- "5150:5150"
networks:
- backend
networks:
backend:
докерфайл
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 5150
#snipped brevity
ENTRYPOINT ["dotnet", "TestingDocker.API.dll"]
параметры запуска
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:5150/",
"sslPort": 0
}
},
Составить вывод
[12:49:29 INF] Now listening on: http://[::]:80
I don’t understand where it get’s the port 80 from.
Docker Desktop
Running Port:5150
Docker Inspect on the image
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"ASPNETCORE_URLS=http:// :80",
"DOTNET_RUNNING_IN_CONTAINER=true",
"DOTNET_VERSION=5.0.10",
"ASPNET_VERSION=5.0.10"
],
Я кое-что прочитал в разделе «Устранение неполадок» о том, как у Windows docker desktop hyper-v есть свой собственный IP-адрес, поэтому я попытался найти его и посмотреть, будет ли он отвечать, но все, что я смог найти, — это вся подсеть, определенная в настройках рабочего стола docker. 192.168.65.0/24
Когда я смотрю на конфигурации виртуальной сетевой карты hyper v, у них есть ip-адрес совершенно другой подсети. 172.19.240.1
Поэтому я вытащил изображение монго, и оно ДЕЙСТВИТЕЛЬНО откликается. Когда я запускаю проверку на нем, единственное отличие, связанное с сетью, я вижу, что у монго есть имя хоста.
Так что я уверен, что это что-то с моими сетевыми настройками, но я не могу этого понять.
ТИА
Редактировать———————
в соответствии с комментарием Камило я добавил обратно точку входа, которую я пробовал ранее.
ENTRYPOINT ["dotnet", "DockerTest.API.dll", "--server.urls", "http://0.0.0.0:5150"]
Я думал, что 0.0.0.0-это привязка ip-адреса с подстановочными знаками, но это не сработало, поэтому я переключился на предложенный
ENTRYPOINT ["dotnet", "DockerTest.API.dll", "--urls", "http:// :5150"]
И это сработало!!
Следует отметить одну вещь. Все эти крошечные изменения, казалось, не привлекали нас, так как предположительно новый образ создавался примерно за 0,03 секунды. Поэтому, чтобы быть уверенным, что мои изменения на протяжении всего этого процесса были подхвачены, я использовал
сборка docker-compose —без кэша
докер-составить-d-принудительно-воссоздать
Комментарии:
1. почему бы вам просто не сопоставить свой локальный порт 5150 с портом 80 вашего изображения? Это, наверное, самый простой способ? т.е.
ports: - "5150:80"
2. @derpirscher Я старался, чтобы вопрос был простым. У меня также есть веб-приложение на порту 80. Пытаюсь включить docker в типичную веб — картинку. Контейнер интерфейсного интерфейса, контейнер данных API, контейнер базы данных mongo, контейнер кэширования redis…. и, конечно, делайте все это из докера-составляйте yml.
3. @Camiloterevint, чтобы увидеть изменения в том, что заставило его работать, а затем превратить ваш комментарий в ответ, чтобы я мог отдать вам должное.
Ответ №1:
У вас есть переменная окружения, такая как:
"ASPNETCORE_URLS=http:// :80"
Это одно создается автоматически ASP.NET Ядро, когда ему не указан какой-либо конкретный URL-адрес для использования, что имеет место в этом вопросе.
Ваша путаница, вероятно, связана с launch.settings.json
файлом, который, по-видимому, настраивает приложение для запуска на порту 5150, но это неверно по 2 причинам:
- Файл предназначен только для отладки Visual Studio, и он не опубликован вместе с приложением, и
- Даже если файл использовался, вы настраиваете
iisExpress
параметры, а IIS Express не существует в Linux.
У вас есть несколько способов решить эту проблему:
- Добавьте карту докера для порта, как упоминал @OneCricketeer, с помощью
5150:80
. - Укажите URL-адрес для использования в качестве части
ENTRYPOINT
:
ENTRYPOINT ["dotnet", "DockerTest.API.dll", "--urls", "http:// :5150"]
- А также другие, такие как указание URL-адресов непосредственно в вашей программе при создании веб-хостинга.
Ответ №2:
Эти журналы являются внутренними для контейнера. Неясно, как вы сказали своему серверу работать на 5150, но EXPOSE не изменяет поведение кода, и, похоже ASPNETCORE_URLS
, существует переменная среды, которая управляет привязкой сервера, и вы нигде ее не переопределяли
Если вы просто хотите использовать localhost:5150 без каких-либо других изменений, вам нужно будет использовать 5150:80
определение портов для создания