【问题标题】:Docker seems to be running with the wrong volumeDocker 似乎以错误的卷运行
【发布时间】:2020-04-30 17:13:09
【问题描述】:

我有一个基于 ASP.NET Core 3.1 框架编写的 Web 项目。我想在 Linux 虚拟机上的 docker 容器中运行该项目。

我创建了以下docker-compose.yml 文件

version: '3.4'

services:
  myproject:
    image: ${DOCKER_REGISTRY-}myproject
    build:
      context: .
      dockerfile: myproject/Dockerfile
    volumes:
      - storage:/storage
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
    ports:
      - 51736:80
      - 44344:443
volumes:
  storage:

当我执行docker-compose up --build

我得到以下输出

Successfully built b084cb989f05
Successfully tagged myproject:latest
Starting myproject_myproject_1 ... done
Attaching to myproject_myproject_1
myproject_1  | Unhandled exception. System.IO.DirectoryNotFoundException: /app/Storage/
myproject_1  |    at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters)
myproject_1  |    at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root)

从上面的日志中,应用程序正在寻找/app/Storage/ 路径来初始化PhysicalFileProvider。我不确定那是从哪里来的。根据我的docker-compose.yml 文件,存储卷应该是我/storage 而不是/app/Storage/

在某些时候,我的docker-compose.yml 文件中有storage:/app/Storage,但它不再存在。什么可能导致图像附加错误的卷/存储文件夹?

更新

这里是Dockerfile的内容

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

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

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

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

我尝试了以下命令删除所有内容

docker-compose down -v --rmi all --remove-orphans
docker-compose build --no-cache

但是,我仍然得到相同的结果。如何正确挂载带有图像的/storage 文件夹?

【问题讨论】:

  • 你的Dockerfile指的是/app/Storage吗?
  • storage:/storage 绝对路径
  • @DuDoff 什么是过时的路径?我现在将通过 Dockerfile 的联系人更新我的问题
  • 你真的做了COPY . . 你需要做的是进入文件夹,如果在终端上输入pwd。如果你是 GUI,那么 right click -> properties -> path 并将该路径转换为 ​​Users/<my-user-name/Desktop/thisfolder/thisfile.txt 之类的东西,然后将文件夹复制到我的 Dockerfile 中,我会这样做 COPY Users/<my-user-name>/Desktop/thisfolder /thisfolder
  • /app/publish 可能在你的Users/John/Documents/something/app/publish 中获取完整路径并放入!

标签: docker docker-compose dockerfile docker-volume docker-image


【解决方案1】:

我认为该消息与 docker-compose 无关。

应用程序中的某些内容告诉它查看该文件夹。该文件夹不存在是正确的,因为 docker-compose 没有创建它。

检查提供此路径的 ASP.NET 应用程序本身中的代码或配置。或者运行dotnet进程als的docker命令,或者dockerfile中设置的环境变量。

更新:

查看您的 dockerfile,我猜该应用正在寻找 storage 而不是 /storage(相对路径而不是绝对路径),这就是为什么您在开始时会获得额外的 /app(从workdir)。

【讨论】:

  • 我对 docker 卷有点困惑。什么根据配置创建 docker 卷?
  • docker compose 创建卷,但我认为这是正确的。我的意思是音量创建正确,应用程序是错误的,因为应用程序在错误的目录中查找。您需要检查指定在何处查找文件夹的应用代码。
  • 查看您的 dockerfile,我猜该应用正在寻找 storage 而不是 /storage(相对路径不是绝对路径),这就是为什么您会在其中获得额外的 /app开头(来自workdir)。
  • 图片有问题。由于第 32 行的错误点。我修改了代码,使storage 全部小写,但错误显示为大写的Storage,所以当我构建图像时,它不是使用 Visual Studio 代码构建的。这是我使用 c#private IWebHostEnvironment Env; Path.Combine(Env.ContentRootPath, "storage") 设置存储路径的方法
  • Path.Combine 似乎有意添加了您不想要的 /app。我不知道。还要检查构建失败时 dockerfile 的行为。执行git clean -dfx 删除所有旧文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2014-09-02
相关资源
最近更新 更多