Как видно из названия, у меня есть контейнер, который не может привязать порт хоста к порту контейнера. Я попытался найти похожие проблемы, но не нашел ничего, связанного с использованием часов 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'.


Просто столкнулся с этой проблемой сам. Я не думаю, что 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/
@BryceHayden Обновил ответ с исправлением для тебя
Да, у меня уже есть эта переменная ... Я немного поиграю с ней, и если я не смогу найти ответ, я позвоню вам
@BryceHayden Сначала я неправильно понял ваш вопрос о томах, я добавил кое-что, что должно помочь
Мне потребовалось некоторое время, чтобы разобраться, так как моя структура папок отличается от вашей, но я, наконец, запустил ее. Спасибо за помощь.
@RyanVice, конечно, но это совсем другая тема, посмотрите эту статью: humankode.com/ssl/…
Есть простое решение: добавьте следующие две строки в файл docker-compose.yml, и ошибка исчезнет.
environment:
- ASPNETCORE_URLS=https://+;http://+;
Не могли бы вы объяснить, что означает «+»? Я попробовал этот ответ в своем docker-compose и все еще получаю ту же ошибку.
@OlusegunOdumosu согласно этой статье: docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/…, «Имена хостов, * и + не являются особенными. Все, что не распознается как действительный IP-адрес или localhost, привязывается ко всем IPv4 и IPv6».
Просто хотел поделиться еще одной проблемой, с которой я столкнулся недавно при контейнеризации набора проектов, даже если все настроено правильно. Надежда может помочь кому-то другому.
Очень неприметно, но некоторые проекты были в Program.cs:
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.Sources.Clear();
...
Что удаляет все источники и конкретно ChainedConfigurationSource, что приводит к указанной выше ошибке.
У меня была версия этого - был проверен некоторый код, который добавил свой собственный синглтон IConfiguration - который, по сути, очищает источники конфигурации
@ Андрей: Сегодня я столкнулся с той же проблемой, есть ли способ перепривязать конфигурации? или явно указав где-нибудь в конфиге? это поможет!
Я решил ту же проблему следующим образом:
appsettings.json добавлено следующее, чтобы заставить Kestrel прослушивать порт 80."Kestrel": {
"EndPoints": {
"Http": {
"Url": "http://+:80"
}
}
}
dockerfileENV ASPNETCORE_URLS=http://+:80
EXPOSE 80
docker run -p 8080:80 <image-name>:<tag>
http://localhost:8080/
Я последовал вашему ответу, чтобы подключить URL-адрес, но я не могу заставить работать автоматическую перезагрузку при изменении файла. Я предполагаю, что я что-то делаю не так в файле docker-compose.yml с томами. Какие-либо предложения?