[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
私は確かにパスで些細なことを確信していますが、誰かがそれに少し光を当てることができるなら、私はそれですべてかなり失われていますか?
ついに、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
お役に立てば幸いです。
ドットネットコアはWindowsに固有のものではなく、誰もがVisual Studioを使用するわけではないことを理解していますが、MicrosoftがVisual Studioに組み込んだこのすばらしい機能があります(2017年に試してみました)。
複数の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
を検索)、もう一度選択して、コンピューターを再起動してください。 こちら を確認してください。
これは 驚くべき投稿 へのリンクです。この問題への取り組み方法について。
彼はすべてのコードを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"]
私は同じ問題を抱えており、他のすべての解決策は私には合わなかったので、自分で解決しました。以下の手順は読みやすいと感じていますが、Dockerを初めて使用する場合は、 新しいDockerユーザー専用のブログ投稿 で行ごとに説明しているので、何が起こっているのかを正確に理解できますこれDockerfile)。
プロジェクトディレクトリにDockerfileを保持します(私の観点では、ソリューションごとに複数のDockerイメージを持つことができるため、ソリューションファイルの隣に保持するよりも優れています)。
次のように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"]
。dockerignoreファイルをソリューションディレクトリに移動-Docker CLIは。dockerignoreファイルをビルドコンテキストのルートディレクトリからのみ取得するため( ドキュメントには )と書かれていますが、すべてのプロジェクトに共通の無視ルールのセットが1つあるので便利です(。gitignoreファイルに似ています)、これは保守が容易です。
ソリューションディレクトリからビルドコマンドを実行します、プロジェクトディレクトリのDockerfileをポイントし、ビルドコンテキストとして現在のディレクトリ(。)を設定します(すべてのプロジェクトにアクセスするため) :
docker build -f PROJECT_DIRECTORY/Dockerfile -t IMAGE_NAME .
docker run -d -p 8080:80 --name my-app-name IMAGE_NAME
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
これが誰かを助けることを願っています。