タイトルが示すように、ホストポートからコンテナポートにバインドできないコンテナがあります。同様の問題を検索しようとしましたが、MicrosoftがMicrosoft/dotnet
SDKイメージに組み込まれたdotnetウォッチを備えたdockerリポジトリ。
私が間違っていることに関する提案は大歓迎です。
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
がlocalhostタイプのURLでうまく機能するとは思わない。コンテナでホスティング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/"
}
}
}
コンテナ内から自動的にリロードするには、ポーリングファイルウォッチャーを使用する必要があります。それが2番目の環境変数の目的です。 (これは非常に一般的で、webpack、angularなどでこれを行う必要があります)。
あなたの場合、esportsapp.volume
をホスト上のディレクトリに変更する必要があります:
volumes:
- ./:/app
これにより、コンテナの/ appボリュームがdocker-composeディレクトリにマッピングされます。直面している問題は、アプリがプロジェクトのデフォルトのdocker-composeネットワーク上のボリュームに組み込まれているため、ソースディレクトリのファイルを変更しても、実際にはそのボリュームでは変更されないことです。ただし、この修正により、ホストのファイルを変更するコンテナ内のドットネット復元とドットネット監視の問題が発生します。あなたが興味を持っているなら、それらのすべてのための修正があります...
My Usual .Net Core App Docker setup
デバッグするには、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/