Docker WORKDIR не создает папку - PullRequest
2 голосов
/ 28 июня 2019

Обновление:

Вот код репо: 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 прошла правильно.

НО затем я посмотрел поближе и обнаружил, что он не создает папку src

Сначала я получил последнее изображение и запустил его:

изображение докера ls

запуск докера b60b91d0d89f

тогда я нашел новый контейнер

Docker 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"]

1 Ответ

5 голосов
/ 28 июня 2019

Это совершенно нормально.

Ваш dockerfile использует многоступенчатую сборку . Вы должны прочитать документацию об этом. По сути, у вас есть один этап (базовый), который представляет собой изображение, которое вы опубликуете, и другой этап (сборка), на котором вы создадите и опубликуете свое приложение.

Все, что вы делаете на этапе сборки, не будет опубликовано, за исключением случаев, когда вы явно скопируете его в окончательное изображение.

Ваш файл dockerfile указывает, что вы копируете свой исходный код в каталог / src этапа сборки. Затем вы создаете и публикуете его, все еще на стадии сборки. После этого вы копируете результаты из этапа сборки в базовый этап. Это то, что делает инструкция COPY --from=publish /app ..

Позволяет публиковать более светлые изображения. Обратите внимание, что базовый образ microsoft/dotnet:2.2-aspnetcore-runtime, тогда как образ сборки основан на более тяжелом microsoft/dotnet:2.2-sdk.


Оригинальный ответ

Проблема не в каталоге /src или /src/dockerapi, который не существует в вашем образе. Это файл dockerapi/dockerapi.csproj, которого нет на вашем хосте.

Это просто ошибка относительного пути. Вы выполняете команду сборки docker из каталога C:\temp\playground\dockerapp\dockerapi. Это означает, что контекст сборки - это каталог dockerapi.

Когда вы выполняете эту строку COPY ["dockerapi/dockerapi.csproj", "dockerapi/"], докер ищет файл C:\temp\playground\dockerapp\dockerapi\dockerapi\dockerapi.csproj (обратите внимание на \dockerapi\dockerapi), который не существует.

Попробуйте изменить контекст сборки докера, выполнив команду сборки из папки dockerapp и передав путь к файлу Docker.

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

Для получения дополнительной информации см. Док-документацию https://docs.docker.com/engine/reference/builder/#usage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...