Docker dotnet watch run error:无法在IPv6环回接口上绑定到https:// localhost:5000

Mik*_*ins 16 docker dockerfile docker-compose asp.net-core

正如标题所示,我有一个无法从主机端口绑定到容器端口的容器.我尝试搜索类似的问题,但是没有发现任何与在docker容器中使用dotnet watch相关的问题,因为微软推出了microsoft/dotnet带有内置于sdk映像中的dotnet watch 的docker repo.

任何关于我做错的建议都非常感谢.

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"]
Run Code Online (Sandbox Code Playgroud)

泊坞窗,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:
Run Code Online (Sandbox Code Playgroud)

完成错误:

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'.
Run Code Online (Sandbox Code Playgroud)

Zac*_*tes 27

我自己遇到了这个问题.我不认为dotnet watch run与localhost类型的URL很好地配合.尝试将您的托管网址设置到https://0.0.0.0:5000您的容器中.

在dockerfile中:

ENTRYPOINT [ "dotnet", "watch", "run", "--no-restore", "--urls", "https://0.0.0.0:5000"]
Run Code Online (Sandbox Code Playgroud)

或者在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/"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在要让它从容器中自动重新加载,您必须使用轮询文件观察器.这就是第二个环境变量的用途.(这很常见,你必须使用webpack,angular等).

在您的情况下,您需要更改esportsapp.volume主机上的目录:

volumes:
  - ./:/app
Run Code Online (Sandbox Code Playgroud)

这会将容器中的/ app卷映射到docker-compose目录.您面临的问题是应用程序是在项目的默认docker-compose网络中的卷中构建的,因此当您更改源目录中的文件时,它实际上并未在该卷中进行更改.但是,通过此修复程序,您将遇到更改主机文件的容器内的dotnet还原和dotnet监视问题.如果您有兴趣,可以解决所有这些问题...

我的常用.Net Core App Docker设置

要调试,请运行: 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...
Run Code Online (Sandbox Code Playgroud)

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 Code Online (Sandbox Code Playgroud)

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 Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

build.yml(用于构建发布版本的docker-compose.yml)

version: "3.5"
services:
  project:
    build:
      context: ./project
      dockerfile: build.Dockerfile
    volumes:
      - ./project:/app
Run Code Online (Sandbox Code Playgroud)

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/
Run Code Online (Sandbox Code Playgroud)

  • 我花了一些时间才弄清楚,因为我的文件夹结构与您的文件夹结构不同,但是我终于使它运行了。谢谢您的帮助。 (2认同)