【问题标题】:Docker WORKDIR doesn't create folderDocker WORKDIR 不创建文件夹
【发布时间】:2019-06-28 12:08:20
【问题描述】:

更新:

这里是代码仓库: https://github.com/franva/dockerapi/tree/master/dockerapi


我是 Docker 新手,我使用 Visual Studio 2017 添加 Docker 支持,所以基本上它只是在项目文件夹下创建一个 Dockerfile。

我跑:

docker build -t dockerapi:init .

E:\temp\playground\dockerapi (master -> origin) 
λ docker build -t dockerapi:imp . 

Sending build context to Docker daemon  25.09kB 
Step 1/17 : FROM microsoft/dotnet:2.2-aspnetcore-runtime 
AS base  ---> c56aab97bc42 
Step 2/17 : WORKDIR /app  ---> Using cache  --->8f9c09673b05 
Step 3/17 : EXPOSE 80  ---> Using cache  --->7b773fae0164 
Step 4/17 : EXPOSE 443  ---> Using cache  --->a5c32bea1008 
Step 5/17 : FROM microsoft/dotnet:2.2-sdk AS build  --->155911c343f3 
Step 6/17 : WORKDIR "/src"  ---> Using cache  --->b5357cf7b8ef 
Step 7/17 : COPY ["dockerapi/dockerapi.csproj","dockerapi/"]  ---> Using cache  ---> 354963ea2dcd 
Step 8/17 : RUN dotnet restore "dockerapi/dockerapi.csproj"  ---> Using cache  --->7ef0324fd068 
Step 9/17 : COPY . .  ---> 93ef0a22b520 
Step 10/17 : WORKDIR /src/dockerapi  ---> Running in 2179c7f48179 
Removing intermediate container 2179c7f48179  ---> ede8a86afa07 

Step 11/17 : RUN dotnet build "dockerapi.csproj" -c Release -o /app  ---> Running in a4d4864c8208 

Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Core Copyright (C) Microsoft Corporation. All rightsreserved.

  Restore completed in 532.79 ms for /src/dockerapp/dockerapp.csproj. 
  Restore completed in 874.46 ms for /src/dockerapi/dockerapi.csproj.  

dockerapp -> /app/dockerapp.dll   
dockerapi -> /app/dockerapi.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:06.46 Removing intermediate container a4d4864c8208 ---> 84f9f429528d 
Step 12/17 : FROM build AS publish  ---> 84f9f429528d 
Step 13/17 : RUN dotnet publish "dockerapi.csproj" -c
Release -o /app  ---> Running in beed612f6c1f 

Microsoft (R) Build
Engine version 16.1.76+g14b0a930a7 for .NET Core Copyright (C)
Microsoft Corporation. All rights reserved.

  Restore completed in 80.99 ms for /src/dockerapp/dockerapp.csproj.  

  Restore completed in 104.18 ms for /src/dockerapi/dockerapi.csproj.  

dockerapp -> /src/dockerapp/bin/Release/netcoreapp2.2/dockerapp.dll 
dockerapi -> /src/dockerapi/bin/Release/netcoreapp2.2/dockerapi.dll 
dockerapi -> /app/ Removing intermediate container beed612f6c1f  ---> 2969bcee4855 
Step 14/17 : FROM base AS final  ---> a5c32bea1008 
Step 15/17 : WORKDIR /app  ---> Using cache  ---> be6b73f67179 
Step 16/17 : COPY --from=publish /app .  ---> Using cache  ---> f4512e5248b0 
Step 17/17 : ENTRYPOINT ["dotnet", "dockerapi.dll"]  ---> Using cache  --->b60b91d0d89f 

Successfully built b60b91d0d89f Successfully tagged dockerapi:imp 

SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

我将 Dockerfile 移动到项目文件夹上方 1 级的解决方案文件夹,然后 docker build 运行正常。

BUT 然后我仔细看了看,发现它没有创建 src 文件夹

我首先得到了最新的镜像并运行镜像:

docker 镜像 ls

码头运行 b60b91d0d89f

然后我找到了新容器

码头工人ps

然后我撞到了容器里

E:\temp\playground\dockerapi (master -> origin)
λ docker exec -it f191ed6a110b bash
root@f191ed6a110b:/app# ls
appsettings.Development.json  dockerapi.pdb                     dockerapp.dll                     web.config
appsettings.json              dockerapi.runtimeconfig.dev.json  dockerapp.pdb
dockerapi.deps.json           dockerapi.runtimeconfig.json      dockerapp.runtimeconfig.dev.json
dockerapi.dll                 dockerapp.deps.json               dockerapp.runtimeconfig.json

这是代码。

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app <--- this line does create app folder
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR "/src" <--- this line doesn't create src folder
COPY ["dockerapi/dockerapi.csproj", "dockerapi/"]
RUN dotnet restore "dockerapi/dockerapi.csproj"
COPY . .
WORKDIR "/src/dockerapi"
RUN dotnet build "dockerapi.csproj" -c Release -o /app

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

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

【问题讨论】:

  • WORKDIR 不会创建您应该使用的文件夹:RUN mkdir -p /src/dockerapi
  • @SeddikOmar 不正确。 WORKDIR 确实创建了目录。根据the official docker documentation 如果 WORKDIR 不存在,即使它没有在任何后续的Dockerfile指令中使用,也会被创建。
  • hi @SeddikOmar "WORKDIR 指令为 Dockerfile 中任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录。如果 WORKDIR 不存在,它将被创建即使它没有在任何后续的 Dockerfile 指令中使用。” docs.docker.com/engine/reference/builder/#workdir 所以如果我理解正确的话,它应该创建指定的文件夹。

标签: .net docker .net-core


【解决方案1】:

这是完全正常的。

您的 dockerfile 使用 multistage build。您应该阅读有关它的文档。基本上,您有一个阶段(基础)是您将发布的映像,另一个阶段(构建)是您将构建和发布您的应用程序。

您在构建阶段所做的一切都不会发布,除非您明确将其复制到最终映像。

您的 dockerfile 指定您将源代码复制到构建阶段的 /src 目录。然后,您构建并发布它,仍然处于构建阶段。完成后,将结果从构建阶段复制到基础阶段。这就是COPY --from=publish /app . 指令的作用。

它允许您发布更轻的图像。请注意,基础镜像是microsoft/dotnet:2.2-aspnetcore-runtime,而构建镜像是基于较重的microsoft/dotnet:2.2-sdk


原答案

问题不在于您的映像中不存在/src/src/dockerapi 目录。这是在您的主机上找不到的 dockerapi/dockerapi.csproj 文件。

这只是一个相对路径错误。您正在从 C:\temp\playground\dockerapp\dockerapi 目录中执行 docker build 命令。这意味着,构建上下文是 dockerapi 目录。

当你执行COPY ["dockerapi/dockerapi.csproj", "dockerapi/"]这一行时,docker正在搜索不存在的C:\temp\playground\dockerapp\dockerapi\dockerapi\dockerapi.csproj(注意\dockerapi\dockerapi)文件。

尝试通过从dockerapp 文件夹执行构建命令并将路径传递给 Dockerfile 来更改 docker 构建上下文。

C:\temp\playground\dockerapp> docker build -f .\dockerapi\Dockerfile .

有关更多信息,请参阅 docker 文档https://docs.docker.com/engine/reference/builder/#usage

【讨论】:

  • 嗨贾斯汀,我的错。实际上,我已经将 Dockfile 从 dockerapi 文件夹移到 .sln 文件夹中,并且我在根文件夹(.sln 文件夹)下运行了所有命令。我提供的照片是我搬出 Dockerfile 之前拍的。
  • @Franva 那你的错误是什么? /src 目录没有被创建?这在multistage build 中很正常。 /src 目录在构建阶段创建,仅用于构建和发布您的项目。这是发布的基础阶段。您编译的代码应该在/app 目录中。并且您的源代码不会被发布。
  • 我刚刚更新了我的问题,删除了图片并粘贴到了整个控制台输出中,供您侦探使用。
  • 嗨@Justin,我还更新了我的代码存储库以反映我所做的事情。如果这对您来说更方便,您可以获取整个代码。谢谢
  • 好极了!!!!现在对我来说更有意义了。所以这意味着自从移出项目文件夹后,我就有了一个工作图像。非常感谢!!!
猜你喜欢
  • 2020-01-08
  • 2021-05-29
  • 1970-01-01
  • 2019-09-19
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多