我现在在学docker技术,但是当我使用VS2019自动生成的docker文件创建镜像时卡在了第七步,提示是找不到文件夹。我打开虚拟机发现docker用户并没有权限进入 /mnt/sda1/var/lib/docker/tmp/文件夹,我也不知道该怎样创建缺少的文件夹。
实验环境是在win10,用的Docker Quickstart Terminal,项目就是一个asp.net core 模板项目
求大神指点一二,该怎么破这个问题,还有求解释一下docker文件里的内容。
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["DDemo/DDemo.csproj", "DDemo/"]
RUN dotnet restore "DDemo/DDemo.csproj"
COPY . .
WORKDIR "/src/DDemo"
RUN dotnet build "DDemo.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "DDemo.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "DDemo.dll"]
报错估计是因为目录些的有问题 COPY ["DDemo/DDemo.csproj", "DDemo/"]
改成 COPY ["DDemo/DDemo.csproj", "/src"]
试试,或者直接复制整个目录进去再执行还原
# 创建构建阶段 base
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
# 创建构建阶段 build
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
# 复制DDemo下的解决方案到此阶段的DDEmo/目录 报错是因为你这个目录并没有,你可以把这个去掉或者看./DDemo是否可以
COPY ["DDemo/DDemo.csproj", "DDemo/"]
RUN dotnet restore "DDemo/DDemo.csproj"
# 复制Dockerfile所在目录的文件到此接端的工作目录 /src ,dotnet restore 可复制后执行
COPY . .
WORKDIR "/src/DDemo"
RUN dotnet build "DDemo.csproj" -c Release -o /app
# 基于 base阶段 创建 publish 阶段,发布项目到/app
FROM build AS publish
RUN dotnet publish "DDemo.csproj" -c Release -o /app
# 基于 base阶段 创建 final 阶段
FROM base AS final
WORKDIR /app
# 从publish阶段的/app目录复制文件到当前工作目录
COPY --from=publish /app .
# 入口点 执行命令
ENTRYPOINT ["dotnet", "DDemo.dll"]
我试了不行,或许可以在主机里建好缺少的文件夹,但是docker用户并没有权限,卡在这了。
将Dockerfile移动到上一级目录
爱死你了
将Dockerfile移动到上一级目录,这有悖vs2019添加Docker支持创建的Dockerfile初衷,不是推荐的使用方式;
请注意失败提示信息
COPY failed: stat /mnt/sda1/var/lib/docker/tmp/docker-builder932966508/DDemo/DDemo.csproj: no such file or directory
意思是Dockerfile的COPY命令使用的是相对路径,Docker构建环境找不到这个相对路径的DDemo/DDemo.csproj
项目文件,
应该是将docker build命令执行目录定位到/f/C#/201909/DDemo
这一级,
docker build命令使用 -f 指定Dockerfile路径,
MINGW64 /f/C#/201909/DDemo
$ docker image build -f ./DDemo/Dockerfile -t aspnetcore:latest .
这样使用,Dockerfile文件里的COPY命令
COPY ["DDemo/DDemo.csproj", "DDemo/"]
就能在docker构建环境找到"DDemo/DDemo.csproj"
这个相对路径的项目文件了
还有一种写法,我创建的是net5的项目。dockerfile文件内容如下:
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY WebApplication1.csproj .
RUN dotnet restore "WebApplication1.csproj"
COPY . .
WORKDIR /src
RUN dotnet build "WebApplication1.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]