Ошибка запуска Docker dotnet watch: невозможно привязать к https: // localhost: 5000 на интерфейсе обратной связи IPv6

Как видно из названия, у меня есть контейнер, который не может привязать порт хоста к порту контейнера. Я попытался найти похожие проблемы, но не нашел ничего, связанного с использованием часов dotnet в контейнере докеров, так как Microsoft представила репозиторий докеров microsoft/dotnet с часами dotnet, встроенными в образ sdk.

Мы очень ценим любые предложения относительно того, что я делаю неправильно.

Dockerfile

FROM microsoft/dotnet:2.1.301-sdk as build
ENV DOTNET_USE_POLLING_FILE_WATCHER 1
WORKDIR /app
COPY . .
RUN dotnet restore
EXPOSE 5000-5001
ENTRYPOINT [ "dotnet", "watch", "run", "--no-restore"]

docker-compose.yml

version: "3"

services:

  esportapp:
    container_name: esportapp
    image: esportapp:dev
    build:
      context: .
      dockerfile: Docker/dev.Dockerfile
    volumes:
      - esportapp.volume:/app
    ports:
      - "5000:5000"
      - "5001:5001"

volumes:
  esportapp.volume:

Полная ошибка:

esportapp    | Hosting environment: Development
esportapp    | Content root path: /app
esportapp    | Now listening on: https://localhost:5001
esportapp    | Now listening on: http://localhost:5000
esportapp    | Application started. Press Ctrl+C to shut down.
esportapp    | warn: Microsoft.AspNetCore.Server.Kestrel[0]
esportapp    |       Unable to bind to https://localhost:5001 on the IPv6 loopback interface: 'Cannot assign requested address'.
esportapp    | warn: Microsoft.AspNetCore.Server.Kestrel[0]
esportapp    |       Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Cannot assign requested address'.
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
28
0
19 377
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Просто столкнулся с этой проблемой сам. Я не думаю, что dotnet watch run хорошо работает с URL-адресами типа localhost. Попробуйте установить URL-адрес хостинга на https://0.0.0.0:5000 в своем контейнере.

В dockerfile с:

ENTRYPOINT [ "dotnet", "watch", "run", "--no-restore", "--urls", "https://0.0.0.0:5000"]

Или в launchSettings.json, например:

{
  "profiles": {
    "[Put your project name here]": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "DOTNET_USE_POLLING_FILE_WATCHER": "true"
      },
      "applicationUrl": "https://0.0.0.0:5000/"
    }
  }
}

Теперь, чтобы заставить его автоматически перезагружаться из контейнера, вам нужно использовать наблюдатель файлов опроса. Для этого нужна вторая переменная окружения. (Это довольно распространено, вы должны делать это с помощью webpack, angular и т. д.).

В вашем случае вам нужно изменить esportsapp.volume в каталог на вашем хосте:

volumes:
  - ./:/app

Это сопоставит том / app в вашем контейнере с каталогом docker-compose. Проблема, с которой вы сталкиваетесь, заключается в том, что приложение встроено в том в сети для создания докеров по умолчанию вашего проекта, поэтому, когда вы изменяете файл в исходном каталоге, он фактически не изменяется в этом томе. Однако с этим исправлением вы столкнетесь с проблемой восстановления dotnet и отслеживания dotnet внутри контейнера, меняющего файлы вашего хоста. Есть исправление для всего этого, если вам интересно ...

Моя обычная установка Docker для приложений .Net Core

Для отладки запустите: docker-compose -f run.yml up --build

Для сборки релиза: docker-compose -f build.yml up --build

Структура проекта

/                                               # source control root
/build.yml                                      # docker-compose file for building a release
/run.yml                                        # docker-compose file for running locally & debugging
/project                                        # an application
/project/build.Dockerfile                       # the docker container that will build "project" for release
/project/run.Dockerfile                         # the docker container that will build and run "project" locally for debugging
/project/.dockerignore                          # speeds up container builds by excluding large directories like "packages" or "node_modules"
/project/src                                    # where I hide my source codez
/project/src/Project.sln
/project/src/Project/Project.csproj
/project/src/Project/Directory.Build.props      # keeps a docker mapped volume from overwriting .dlls on your host
/project/src/Project.Data/Project.Data.csproj   # typical .Net project structure
/web-api                                        # another application...

Directory.Build.props (поместите это в ту же папку, что и ваш .csproj, чтобы ваша команда dotnet watch run не вмешивалась в исходный каталог на вашем хосте)

<Project>

  <PropertyGroup>
    <DefaultItemExcludes>$(DefaultItemExcludes);$(MSBuildProjectDirectory)/obj/**/*</DefaultItemExcludes>
    <DefaultItemExcludes>$(DefaultItemExcludes);$(MSBuildProjectDirectory)/bin/**/*</DefaultItemExcludes>
  </PropertyGroup>

  <PropertyGroup Condition = "'$(DOTNET_RUNNING_IN_CONTAINER)' == 'true'">
    <BaseIntermediateOutputPath>$(MSBuildProjectDirectory)/obj/container/</BaseIntermediateOutputPath>
    <BaseOutputPath>$(MSBuildProjectDirectory)/bin/container/</BaseOutputPath>
  </PropertyGroup>

  <PropertyGroup Condition = "'$(DOTNET_RUNNING_IN_CONTAINER)' != 'true'">
    <BaseIntermediateOutputPath>$(MSBuildProjectDirectory)/obj/local/</BaseIntermediateOutputPath>
    <BaseOutputPath>$(MSBuildProjectDirectory)/bin/local/</BaseOutputPath>
  </PropertyGroup>

</Project>

run.yml (docker-compose.yml для отладки)

version: "3.5"
services:
  project:
    build:
      context: ./project
      dockerfile: run.Dockerfile
    ports:
      - 5000:80
    volumes:
      - ./project/src/Project:/app

run.Dockerfile (Dockerfile для отладки)

FROM microsoft/dotnet:2.1-sdk

# install the .net core debugger
RUN apt-get update
RUN apt-get -y --no-install-recommends install unzip
RUN apt-get -y --no-install-recommends install procps
RUN rm -rf /var/lib/apt/lists/*

RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /vsdbg

VOLUME /app
WORKDIR /app

CMD dotnet watch run --urls http://0.0.0.0:80

build.yml (docker-compose.yml для сборки версий выпуска)

version: "3.5"
services:
  project:
    build:
      context: ./project
      dockerfile: build.Dockerfile
    volumes:
      - ./project:/app

build.Dockerfile (Dockerfile для сборки релизных версий)

FROM microsoft/dotnet:2.1-sdk

VOLUME /app

# restore as a separate layer to speed up builds
WORKDIR /src
COPY src/Project/Project.csproj .
RUN dotnet restore

COPY src/Project/ .
CMD dotnet publish -c Release -o /app/out/

Я последовал вашему ответу, чтобы подключить URL-адрес, но я не могу заставить работать автоматическую перезагрузку при изменении файла. Я предполагаю, что я что-то делаю не так в файле docker-compose.yml с томами. Какие-либо предложения?

BryceHayden 12.12.2018 21:26

@BryceHayden Обновил ответ с исправлением для тебя

Zachary Yates 12.12.2018 22:08

Да, у меня уже есть эта переменная ... Я немного поиграю с ней, и если я не смогу найти ответ, я позвоню вам

BryceHayden 12.12.2018 23:06

@BryceHayden Сначала я неправильно понял ваш вопрос о томах, я добавил кое-что, что должно помочь

Zachary Yates 13.12.2018 06:34

Мне потребовалось некоторое время, чтобы разобраться, так как моя структура папок отличается от вашей, но я, наконец, запустил ее. Спасибо за помощь.

BryceHayden 18.12.2018 20:53

@RyanVice, конечно, но это совсем другая тема, посмотрите эту статью: humankode.com/ssl/…

Zachary Yates 28.05.2020 00:54

Есть простое решение: добавьте следующие две строки в файл docker-compose.yml, и ошибка исчезнет.

    environment:
      - ASPNETCORE_URLS=https://+;http://+;

Не могли бы вы объяснить, что означает «+»? Я попробовал этот ответ в своем docker-compose и все еще получаю ту же ошибку.

az6bcn 30.11.2020 00:28

@OlusegunOdumosu согласно этой статье: docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/…, «Имена хостов, * и + не являются особенными. Все, что не распознается как действительный IP-адрес или localhost, привязывается ко всем IPv4 и IPv6».

shukebeta 09.12.2020 21:34

Просто хотел поделиться еще одной проблемой, с которой я столкнулся недавно при контейнеризации набора проектов, даже если все настроено правильно. Надежда может помочь кому-то другому.

Очень неприметно, но некоторые проекты были в Program.cs:

.ConfigureAppConfiguration((hostingContext, config) =>
{
    config.Sources.Clear();
    ...

Что удаляет все источники и конкретно ChainedConfigurationSource, что приводит к указанной выше ошибке.

У меня была версия этого - был проверен некоторый код, который добавил свой собственный синглтон IConfiguration - который, по сути, очищает источники конфигурации

Kevin Hirst 18.06.2020 22:28

@ Андрей: Сегодня я столкнулся с той же проблемой, есть ли способ перепривязать конфигурации? или явно указав где-нибудь в конфиге? это поможет!

mehul9595 09.04.2021 08:12

Я решил ту же проблему следующим образом:

  1. В appsettings.json добавлено следующее, чтобы заставить Kestrel прослушивать порт 80.
"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://+:80"
    }
  }
}
  1. Выставил порт в dockerfile
ENV ASPNETCORE_URLS=http://+:80

EXPOSE 80
  1. Запустите контейнер, используя следующую команду.
docker run -p 8080:80 <image-name>:<tag>
  1. Приложение представлено на http://localhost:8080/

Другие вопросы по теме