asp.net core 2.0 - 多个项目解决方案docker文件

dee*_* zg 27 docker asp.net-core

[asp.net核心2.0和linux的docker]

我是docker的新手,并试图找出如何在我有2个项目的解决方案的情况下使用docker.我见过的所有教程都展示了单个项目.

所以,如果有人能够逐步展示解决方案,我会非常感激.

我有一个解决方案结构,如:

Solution.sln
|______WebAPIProject.csproj
|______ClassLibraryProject.csproj
Run Code Online (Sandbox Code Playgroud)

在Visual Studio中,我已经为解决方案添加了docker支持并获得了这些文件:

在WebAPIProject下,它创建了这个Docker文件:

FROM microsoft/aspnetcore:2.0
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "WebAPIProject.dll"]
Run Code Online (Sandbox Code Playgroud)

然后,在单独的docker-compose'项目'下,我得到了:

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

docker.compose.yml文件

version: '3'

services:
  WebAPIProject:
    image: WebAPIProject
    build:
      context: ./WebAPIProject
      dockerfile: Dockerfile
Run Code Online (Sandbox Code Playgroud)

我确信它的路径是微不足道的,但我只是迷失了所有这一切,所以如果有人能够对它有所了解?

小智 34

我遇到了同样的问题,所有其他解决方案都不适合我,所以我自己解决了。我觉得下面的步骤清晰易读,但如果你是 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"]
Run Code Online (Sandbox Code Playgroud)
  1. .dockerignore文件移动到解决方案目录- 这是必需的,因为 Docker CLI仅从构建上下文的根目录中获取.dockerignore文件(如文档所述),但它也很方便,因为您有一个适用于所有项目的通用忽略规则集(类似于.gitignore文件),更易于维护。

  2. 从解决方案目录运行构建命令,指向项目目录中的Dockerfile,并将当前目录 ( . )设置为构建上下文(以访问所有项目):

docker build -f PROJECT_DIRECTORY/Dockerfile -t IMAGE_NAME .
Run Code Online (Sandbox Code Playgroud)
  1. 像往常一样运行容器,例如:
docker run -d -p 8080:80 --name my-app-name IMAGE_NAME
Run Code Online (Sandbox Code Playgroud)

  • 第四点正是我所需要的!谢谢你!对于我的情况,我通过 VS“添加 Docker 支持”生成了 dockerfile。之后,我只需从解决方案目录执行 docker build 命令,指向目标项目的 Dockerfile 路径。 (3认同)

Rod*_*Rod 20

我终于找到了一种如何使用docker构建解决方案的方法.

我刚刚创建了一个包含以下内容的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"]
Run Code Online (Sandbox Code Playgroud)

请注意,我认为您可能必须尊重项目构建依赖项,但我真的不知道.

示例调用构建:

sudo docker build --no-cache -t webapi:dev .
Run Code Online (Sandbox Code Playgroud)

要运行的示例调用:

sudo docker run -d=false -p 8080:80 --name webapi webapi:dev
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 这就是为什么docker无法找到您的sln文件的原因。从docker文件位置可以看到相对路径。请将docker文件复制到解决方案文件夹中。 (2认同)

Jos*_*e A 16

虽然我了解到dotnet核心并不是特定于Windows的,并不是每个人都将使用Visual Studio,但Microsoft Visual Studio内置了这一简洁功能(2017年对其进行了尝试)。

  1. 右键单击Web项目。
  2. 选择添加。
  3. 然后是“ Docker支持”。这将自动将多个项目提取到容器中。

如果您有多个Web项目,则分别对每个项目重复该步骤。

这是参考:https : //docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/docker/visual-studio-tools-for-docker?view=aspnetcore-2.1#existing-app

如果在运行Docker容器时碰巧遇到任何问题,请尝试Hyper-V Services在“ Windows功能”中取消选择(在“ Windows Features开始”菜单中搜索),再次选择,然后重新启动计算机。在这里检查。

在此处输入图片说明

  • 这是一个救命秘诀。这两天纠结这个问题。非常感谢。 (2认同)

Yeh*_*rov 10

这链接到一篇关于如何解决这个问题的精彩帖子

他提到将所有代码放在一个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"]
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

12771 次

最近记录:

6 年,3 月 前