web-dev-qa-db-ja.com

asp.net core 2.0-複数プロジェクトソリューションドッカーファイル

[asp.net core 2.0およびLinux用docker]

私はdockerを初めて使用し、2つのプロジェクトでソリューションがある場合にdockerを使用する方法を理解しようとしています。私が見たすべてのチュートリアルは、単一のプロジェクトで表示されます。

だから、誰かがステップバイステップのソリューションを示すことができれば、本当に感謝しています。

私は次のようなソリューション構造を持っています:

Solution.sln
|______WebAPIProject.csproj
|______ClassLibraryProject.csproj

Visual Studioでは、Dockerサポートをソリューションに追加し、次のファイルを取得しました。

WebAPIProjectの下で、これを作成しましたDocker file

FROM Microsoft/aspnetcore:2.0
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "WebAPIProject.dll"]

次に、別個のdocker-compose 'project'の下に私が持っています:

docker-compose.ci.build.yml

version: '3'

services:
  ci-build:
    image: Microsoft/aspnetcore-build:1.0-2.0
    volumes:
      - .:/src
    working_dir: /src
    command: /bin/bash -c "dotnet restore ./Solution.sln && dotnet publish ./Solution.sln -c Release -o ./obj/Docker/publish"

およびdocker.compose.ymlファイル

version: '3'

services:
  WebAPIProject:
    image: WebAPIProject
    build:
      context: ./WebAPIProject
      dockerfile: Dockerfile

私は確かにパスで些細なことを確信していますが、誰かがそれに少し光を当てることができるなら、私はそれですべてかなり失われていますか?

21
dee zg

ついに、Dockerを使用してソリューションを構築する方法を見つけました。

重要:これが機能するには、Dockerfileファイルをソリューションファイルと同じ場所に配置する必要があります

次のコンテンツを含むdockerファイルを作成しました。

FROM Microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM Microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY Solution.sln ./
COPY ClassLibraryProject/*.csproj ./ClassLibraryProject/
COPY WebAPIProject/*.csproj ./WebAPIProject/

RUN dotnet restore
COPY . .
WORKDIR /src/ClassLibraryProject
RUN dotnet build -c Release -o /app

WORKDIR /src/WebAPIProject
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebAPIProject.dll"]

プロジェクトビルドの依存関係を尊重する必要があるかもしれないと思いますが、実際にはわかりません。

ビルドのサンプル呼び出し:

Sudo docker build --no-cache -t webapi:dev .

実行するサンプル呼び出し:

Sudo docker run -d=false -p 8080:80 --name webapi webapi:dev

お役に立てば幸いです。

16
Rod

ドットネットコアはWindowsに固有のものではなく、誰もがVisual Studioを使用するわけではないことを理解していますが、MicrosoftがVisual Studioに組み込んだこのすばらしい機能があります(2017年に試してみました)。

  1. Webプロジェクトを右クリックします。
  2. 追加を選択します。
  3. 次に、「Dockerサポート」。これにより、複数のプロジェクトがコンテナに自動的にフェッチされます。

複数のWebプロジェクトがある場合は、それぞれに対して個別に手順を繰り返します。

リファレンスは次のとおりです。 https://docs.Microsoft.com/en-us/aspnet/core/Host-and-deploy/docker/visual-studio-tools-for-docker?view=aspnetcore-2.1#既存のアプリ

Dockerコンテナの実行中に問題が発生した場合は、[Windowsの機能]でHyper-V Servicesの選択を解除し([スタート]メニューでWindows Featuresを検索)、もう一度選択して、コンピューターを再起動してください。 こちら を確認してください。

enter image description here

13
Jose A

これは 驚くべき投稿 へのリンクです。この問題への取り組み方法について。

彼はすべてのコードをsrcディレクトリに置くことを述べています。私はそうしなかった、そしてこれは私が思いついたファイルです:(キーはfor fileパート。そうでなければ、それは最高のdockerfileではないと確信しています。ヒントは大歓迎です。)

FROM Microsoft/dotnet:2.2-aspnetcore-runtime-stretch-slim AS base
WORKDIR /app
EXPOSE 5000

FROM Microsoft/dotnet:2.2-sdk-stretch AS build
WORKDIR /src

COPY ./*.sln ./

COPY */*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done
RUN dotnet restore

COPY . ./
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .

ENV ASPNETCORE_URLS="http://*:5000"
ENTRYPOINT ["dotnet", "PersonalSiteApi.dll"]
3
Yehuda Makarov

私は同じ問題を抱えており、他のすべての解決策は私には合わなかったので、自分で解決しました。以下の手順は読みやすいと感じていますが、Dockerを初めて使用する場合は、 新しいDockerユーザー専用のブログ投稿 で行ごとに説明しているので、何が起こっているのかを正確に理解できますこれDockerfile)。

  1. プロジェクトディレクトリにDockerfileを保持します(私の観点では、ソリューションごとに複数のDockerイメージを持つことができるため、ソリューションファイルの隣に保持するよりも優れています)。

  2. 次のようにDockerfileを構成します。

FROM mcr.Microsoft.com/dotnet/core/sdk:2.2 AS build-env
WORKDIR /app

COPY . ./
RUN dotnet publish PROJECT_NAME -c Release -o out

FROM mcr.Microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY --from=build-env /app/PROJECT_NAME/out .

ENTRYPOINT ["dotnet", "PROJECT_NAME.dll"]
  1. 。dockerignoreファイルをソリューションディレクトリに移動-Docker CLIは。dockerignoreファイルをビルドコンテキストのルートディレクトリからのみ取得するため( ドキュメントには )と書かれていますが、すべてのプロジェクトに共通の無視ルールのセットが1つあるので便利です(。gitignoreファイルに似ています)、これは保守が容易です。

  2. ソリューションディレクトリからビルドコマンドを実行します、プロジェクトディレクトリのDockerfileをポイントし、ビルドコンテキストとして現在のディレクトリ()を設定します(すべてのプロジェクトにアクセスするため) :

docker build -f PROJECT_DIRECTORY/Dockerfile -t IMAGE_NAME .
  1. コンテナを通常どおり実行します。例:
docker run -d -p 8080:80 --name my-app-name IMAGE_NAME
2
tometchy
FROM Microsoft/dotnet:sdk AS build-env
WORKDIR /app

RUN mkdir /output

# Copy project and publish

COPY . /app

WORKDIR /app/YourProjectName
RUN dotnet publish --configuration Debug --output /output

# Build runtime image
FROM Microsoft/dotnet:aspnetcore-runtime

ENV ASPNETCORE_URLS http://*:5001

WORKDIR /app

COPY --from=build-env /output .
EXPOSE 5001

ENTRYPOINT ["dotnet", "YourProjectName.dll"]

これは私のために働いたDocker構成です。これは、多くの子プロジェクト参照を持つASP.NET Core 2 WebApiプロジェクトでした。

Then run it using  docker run -d -p 8080:5001 --name some-name yourpojectname

これが誰かを助けることを願っています。

1
Mateusz Migała