You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用docker compose up时项目Releases目录文件丢失求助

问题

我正在构建一个通过HTTP提供zip文件的ASP.NET Core Web API项目,待提供的文件存储在项目内名为Releases的目录中。我使用Visual Studio 2022内置的「Add > Container Orchestrator Support」功能生成了docker-compose文件。通过Visual Studio顶部的运行按钮启动容器时一切正常,但使用docker compose up启动容器时,运行时的Releases目录仅包含子目录,没有文件。我遗漏了什么?

项目文件结构

MyApp/
├─ docker-compose.yml
├─ docker-compose.override.yml
├─ MyApp.sln
├─ MyApp/
│  ├─ MyApp.csproj
│  ├─ Program.cs
│  ├─ Dockerfile
│  ├─ Releases/

docker-compose.yml

version: '3.4'

services:
  releasemanager:
    container_name: app
    image: ${DOCKER_REGISTRY-}myapp
    build:  
      context: .
      dockerfile: MyApp/Dockerfile        

MyApp.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
    <UserSecretsId>***</UserSecretsId>
    <DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Data.SqlClient" Version="5.0.0" />
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.0" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
  </ItemGroup>

</Project>

docker-compose.override.yml

version: '3.4'

services:
  myapp:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro

Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

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

FROM build AS publish
RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]
解决方案

核心问题是Releases目录下的文件未被纳入Docker镜像的发布产物,且Visual Studio运行时会自动挂载本地项目目录,而docker compose up直接使用构建好的镜像,无本地文件挂载。

1. 配置项目将Releases文件纳入发布

修改MyApp.csproj,在<Project>节点内添加以下配置,让dotnet publish时自动复制Releases目录的所有文件到发布目录:

<ItemGroup>
  <!-- 包含Releases目录下所有文件,发布时同步复制 -->
  <Content Include="Releases/**">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

2. 重新构建并启动容器

执行以下命令重新构建镜像并启动容器:

docker compose build
docker compose up

此时容器内/app/Releases目录会包含所有预期文件。

为什么Visual Studio运行正常?

Visual Studio在启动容器时,会自动将本地项目目录挂载到容器内(开发阶段的便利特性),因此容器能直接读取本地Releases目录的文件;而docker compose up使用的是构建完成的镜像,镜像内仅包含dotnet publish阶段复制的文件,未配置的Releases文件不会被纳入,导致目录为空。

内容的提问来源于stack exchange,提问作者tabeqc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:05:54