如标题所示,我有一个无法从主机端口绑定到容器端口的容器。我尝试搜索类似的问题,但是自从Microsoft microsoft/dotnet在sdk映像中引入了带有dotnet watch 的docker repo 以来,没有发现与在docker容器中使用dotnet watch相关的任何信息。
microsoft/dotnet
对于我在做什么错的任何建议,我们将不胜感激。
Docker文件
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与localhost类型的url配合不好。尝试https://0.0.0.0:5000在您的容器中将托管网址设置为。
dotnet watch run
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改为主机上的目录:
esportsapp.volume
volumes: - ./:/app
它将容器中的/ app卷映射到docker-compose目录。您面临的问题是该应用程序内置在项目默认的docker- compose网络上的某个卷中,因此,当您在源目录中更改文件时,该卷中实际上并没有更改。但是,使用此修复程序,您将遇到容器内部dotnet恢复和dotnet监视更改主机文件的问题。如果您有兴趣,可以解决所有问题…
我通常的.Net Core App Docker设置
要调试,请运行: docker-compose -f run.yml up --build
docker-compose -f run.yml up --build
要构建发行版: docker-compose -f build.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/