web-dev-qa-db-fra.com

Erreur d'exécution de la veille doter Docker: impossible de se lier à https: // localhost: 5000 sur l'interface de bouclage IPv6

Comme le titre l'indique, j'ai un conteneur qui ne peut pas se lier du port hôte au port conteneur. J'ai essayé de rechercher des problèmes similaires, mais je n'ai trouvé aucun problème lié à l'utilisation de la surveillance dotnet dans un conteneur Docker depuis que Microsoft a introduit le Microsoft/dotnet docker repo avec dotnet watch intégré à l'image sdk.

Toutes les suggestions sur ce que je fais mal sont très appréciées.

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:

Erreur complète:

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'.
13
Mike Hawkins

Je viens de rencontrer ce problème moi-même. Je ne pense pas dotnet watch run joue bien avec les URL de type localhost. Essayez de définir votre URL d'hébergement sur https://0.0.0.0:5000 dans votre conteneur.

Dans le dockerfile avec:

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

Ou dans launchSettings.json comme:

{
  "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/"
    }
  }
}

Maintenant, pour qu'il se recharge automatiquement à partir du conteneur, vous devez utiliser l'observateur de fichiers d'interrogation. C'est à cela que sert la deuxième variable d'environnement. (C'est assez courant, vous devez le faire avec webpack, angular, etc.).

Dans votre cas, vous devez modifier le esportsapp.volume dans un répertoire de votre hôte:

volumes:
  - ./:/app

Cela mappera le volume/app de votre conteneur au répertoire docker-compose. Le problème auquel vous êtes confronté est que l'application est intégrée dans un volume sur le réseau docker-compose par défaut de votre projet, donc lorsque vous modifiez un fichier dans le répertoire source, il ne change pas réellement dans ce volume. Avec ce correctif, cependant, vous rencontrerez le problème de la restauration dotnet et de la surveillance dotnet à l'intérieur du conteneur en modifiant les fichiers de votre hôte. Il y a une solution à tout cela, si vous êtes intéressé ...

Ma configuration habituelle Docker .Net Core App

Pour déboguer, exécutez: docker-compose -f run.yml up --build

Pour créer une version: docker-compose -f build.yml up --build

Structure du projet

/                                               # 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 (mettez-le dans le même dossier que votre .csproj, conserve votre dotnet watch run commande de jouer avec le répertoire source sur votre hôte)

<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 pour le débogage)

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

run.Dockerfile (le Dockerfile pour le débogage)

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 (le docker-compose.yml pour les versions de version de construction)

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

build.Dockerfile (le Dockerfile pour les versions de version de construction)

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/
23
Zachary Yates