使用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
相关产品推荐
相关产品推荐

