Это совершенно нормально.
Ваш 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