LINUX.ORG.RU

Dockerfile & docker-compose

 , , ,


0

1

Доброго времени суток.

Появилась необходимость запихнуть приложение в docker, но я в нем не шарю.

Приложение ASP.NET Core 3.1 Web Api, создано по стандартному шаблону WebApi-приложения в Rider от JetBrains.

Добавил в корень проекта Dockerfile следующего содержания:

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

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

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

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

Падает на строке COPY [«Project/Project.csproj», «Project/»]

ERROR: Service 'web' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder866392462/Project/Project.csproj: no such file or directory

Еще есть docker-compose.yml

version: '3.4'
services:
  web:
    build: .
    ports:
      - "5000:5000"

В самом проекте по указанному пути файл есть, запускаю через docker-compose up

★★★

Я давно с докером не возился, но чисто догадка. Попробуй писать ./ перед началом, т.е. COPY ["./Project/Project.csproj", "Project/"]. Ну или вообще абсолютный влепить, чисто для теста.

И вообще, контейнер без docker compose собирается? Через docker build.

ox55ff ★★★★★
()

[«Project/Project.csproj», «Project/»]

Я вообще пишу

COPY Project/Project.csproj Project/
Andreezy
()

Сам Dockerfile где лежит относительно Project/Project.csproj? В твоём случае имеется в виду, что папка Project лежит в той же папке, что и Dockerfile. если же Dockerfile лежит в ней, то путь должен выглядеть как ./Project.csproj

te111011010
()

Попробуй писать ./ перед началом

Это помогло, правда я так и не догоняю почему, нашел туториал от микрософта по контейнеризации именно ASP.NET Core, сделал всё по шагам и в проекте-туториала всё работает, когда делаю тоже самое у себя - нет, сравнивал где папки и нужные файлы относительно друг друга находятся, всё правильно 100%, хз что ему там нужно было. На гитхабе есть issues связанные точно с этой проблемой, они вроде как закрыты.

Еще решил взять Dockerfile из туториала вместо того что в ОП-посте, т.к. он со старого ASP.NET проекта выдран.

Теперь Dockerfile выглядит так:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY ./*.csproj ./Project/
COPY ./*.csproj ./ProjectTest/
RUN dotnet restore

# copy everything else and build app
COPY ./* ./Project/
COPY ./* ./ProjectTest/
WORKDIR /source
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "Project.dll"]

Теперь копирование файлов проходит нормально но он падает на строчке
RUN dotnet restore

The project file «/source/ProjectTest/ProjectTest.csproj» was not found. [/source/Project.sln]

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

Но как он может быть нот фаунд если в предыдущем шаге был успешно копирован ?

BLOBster ★★★
() автор топика
Ответ на: комментарий от te111011010

Dockerfile лежит в ней, то путь должен выглядеть как ./Project.csproj

да так работает, теперь со следующим шагом туплю

BLOBster ★★★
() автор топика

структура проекта выглядит так

                        |
               корневая папка проекта(.sln здесь)

                |             |
               код          тесты
(Dockerfile и compose здесь)    
BLOBster ★★★
() автор топика
Ответ на: комментарий от BLOBster

починил, всё успешно сбилдилось и запустилось, докерфайл выглядит так

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /source

# copy .sln and restore as distinct layers
COPY ./*.sln . ./
RUN dotnet restore

# build app
WORKDIR /source
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "Project.dll"]

Всё оказалось проще, не нужно с этими .csproj возиться.

Теперь вопрос в том как мне с хоста туда достучаться.

BLOBster ★★★
() автор топика
Ответ на: комментарий от BLOBster

Пока удалось добиться того что на любой вопрос отвечает «connection reset»

В dockerfile есть EXPOSE 80 вместо 5000

в docker-compose.yml

version: '3.4'
services:
  web:
    build: .
    ports:
      - "5000:80"

При запуске после успешного билда пишу docker run -it --rm -p 5000:80 --name project_name <containerID>

BLOBster ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.