Работая над решением на основе ServiceFabric и создавая образ докера, я получаю следующее из-за своей структуры каталогов:
Моя структура каталогов
D:
D1:
src:
Foo.Fabric:
Foo.Fabric: -----------------> This is context right now
.vs
Foo.Service:
DockerFile
Foo.Service.csproj
docker-compose.yml
.dockerignore
Foo.Lib:
Foo.Lib:
Foo.Lib.csproj
Содержимое моего docker-compose.yml выглядит так:
version: '3.4'
services:
foo:
image: foodockerimage
build:
context: .
dockerfile: Foo.Service/Dockerfile
А содержимое моего dockerfile выглядит следующим образом
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY Foo.Service/Foo.Service.csproj Foo.Service/
COPY ../Foo.Lib/Foo.Lib/Foo.Lib.csproj ../Foo.Lib/Foo.Lib/
RUN dotnet restore Foo.Service/Foo.Service.csproj
COPY . .
WORKDIR /src/Foo.Service
RUN dotnet build Foo.Service.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish Foo.Service.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Foo.Service.dll"]
Как мы видим здесь, ясно, что мне нужно собрать этот Lib.csproj вместе с моим основным Foo.Service.csproj. Проблема в расположении каталога проекта Lib. Поскольку это используется некоторыми другими решениями, я не могу переместить этот проект Lib в папку Foo.Fabric.
Теперь изначально я получил ошибку «Служба 'foo' не смогла скомпилировать: COPY fail: запрещенный путь вне контекста сборки: ../Foo.Lib/Foo.Lib/Foo.Lib.csproj", ОК, я получил это, у меня неправильный контекст, поэтому я обновил в docker-compose.yml как
build: context:. построить: контекст: ..
чтобы изменить контекст на родительский каталог текущего каталога, поэтому мне снова придется изменить пути dockerfile, в результате чего docker-compose.yml будет иметь вид
version: '3.4'
services:
foo:
image: foodockerimage
build:
context: ..
dockerfile: Foo.Fabric/Foo.Service/Dockerfile
А также
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY Foo.Fabric/Foo.Service/Foo.Service.csproj Foo.Fabric/Foo.Service/ #Updated
COPY Foo.Lib/Foo.Lib/Foo.Lib.csproj Foo.Lib/Foo.Lib/ #Updated
RUN dotnet restore Foo.Service/Foo.Service.csproj
COPY . .
WORKDIR /src/Foo.Service
RUN dotnet build Foo.Service.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish Foo.Service.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Foo.Service.dll"]
Теперь у меня есть эта ошибка "PermissionError: [Errno 13] В доступе отказано: '\\? \ D: \ D1 \ src \ Foo.Fabric \ .vs \ Foo.Fabric \ v15 \ Server \ sqlite3 \ db.lock «"
Я действительно трахаюсь с этим и не могу встать.
Кстати, я использую:
Docker Desktop Community Версия 2.0.0.0-win81 (29211) Движок: 18.09.0
Visual Studio Professional 2017 15.9.3
Windows 10 1809