【问题标题】:How to copy a csproj file using docker without visual studio and without docker compose?如何在没有 Visual Studio 和 docker compose 的情况下使用 docker 复制 csproj 文件?
【发布时间】:2019-04-02 15:16:19
【问题描述】:

我刚刚开始使用 Visual Studio 15.8.8 的 .NET Core 项目 (2.1) 的新解决方案。它可以通过将 docker compose 文件设置为启动项目来运行和调试它。有效!

从逻辑上讲,我应该能够使用简单的命令行语句构建 docker 映像。但是,它抱怨找不到 csproj。这很奇怪。该文件存在,正如我所说,我可以从 Visual Studio 运行它。我从一个目录和具有 dockerfile 的目录尝试了它。同样的问题。

我该如何解决这个问题?我唯一想要的就是简单地构建我的图像,然后使用 docker 命令运行它。

Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["TryNewDocker2/TryNewDocker2.csproj", "TryNewDocker2/"]
RUN dotnet restore "TryNewDocker2/TryNewDocker2.csproj"
COPY . .
WORKDIR "/src/TryNewDocker2"
RUN dotnet build "TryNewDocker2.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "TryNewDocker2.csproj" -c Release -o /app

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

Het 是撰写文件:

version: '3.4'

services:
  trynewdocker2:
    image: ${DOCKER_REGISTRY}trynewdocker2
    build:
      context: .
      dockerfile: TryNewDocker2/Dockerfile

从逻辑上讲,我希望“docker-compose up”在解决此问题时继续工作。

【问题讨论】:

  • 编辑问题以包含您的Dockerfile
  • 刚刚在帖子中完成
  • 我认为没有必要在执行dotnet publish 之前执行dotnet build,应该隐含构建。
  • @Matthew 你说得有道理,但这只是自动生成的 dockerfile。首先,我想让这项工作(这应该很容易,因为它是默认设置)。然后我想让它变得更好。

标签: docker asp.net-core .net-core dockerfile


【解决方案1】:

这是由于 dockerfile 中文件路径的根文件夹错误造成的。

Docker启动时,它的根文件夹是C:\Users\...\repos\TryNewDocker2,但是从command运行时,它的根目录是C:\Users\...\repos\TryNewDocker2\TryNewDocker2,所以TryNewDocker2.csproj的路径从TryNewDocker2/TryNewDocker2.csproj变成了@987654327 @

试试下面的dockerfile:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 59162
EXPOSE 44342

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["TryNewDocker2.csproj", "TryNewDocker2/"]
RUN dotnet restore "TryNewDocker2/TryNewDocker2.csproj"
COPY . ./TryNewDocker2/
WORKDIR "/src/TryNewDocker2"
RUN dotnet build "TryNewDocker2.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "TryNewDocker2.csproj" -c Release -o /app

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

更新

对于在 Docker 和命令中工作,请不要更改您的 dockerfile,并从下面的路径中指定 dockerfile 路径来运行您的命令。

C:\Users\...\repos\TryNewDocker2>docker build -t gogo -f TryNewDocker2/Dockerfile .

【讨论】:

  • 谢谢。这可行,但它引入了一个新问题。 “docker-compose up”给出错误:“错误:服务'trynewdocker2'未能构建:复制失败:stat /var/lib/docker/tmp/docker-builder986714315/TryNewDocker2.csproj:没有这样的文件或目录”。它是使用 Visual Studio 创建的标准 .NET Core 项目,在解决方案文件夹中有一个 compose 文件,在项目文件夹中有一个 docker 文件。
【解决方案2】:

对于那些像我一样多年后来到这里的人,我将分享我的经验。

我的问题是由来自 Visual Studio 的“添加 > Docker 支持...”的自动生成的 Dockerfile 引起的,它与我的 .csproj 文件处于同一级别。

给我带来麻烦的特定行是COPY ["MyApp/MyApp.csproj", "MyApp/"],应该只是COPY ["MyApp.csproj", "MyApp/"]。删除 .csproj 前面的额外 MyApp/ 使构建工作正常。

特别感谢 Edward 在上面的回答中为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多