Docker使用.Net Core API

Bry*_*den 5 c# .net-core dockerfile docker-compose

好吧,我正在尝试使用.net核心api进行docker-compose构建.文件夹结构如下:

  • 后端
    • D b
    • 服务
      • SRC
        • API
          • api.csproj
      • 测试
      • services.sln
      • Dockerfile
  • 客户
  • 泊坞窗,compose.yml

我的root docker-compose.yml文件如下:

version: '3.3'

services:
  plan-analytics-postgres:
    container_name: plan-analytics-postgres
    restart: always
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
      PGPASSWORD: admin
    build:
      context: ./backend/db
    ports:
      - '5432:5432'
    networks:
      - 'backend-net'

  plan-analytics-services:
    container_name: plan-analytics-services
    build:
      context: ./backend/services
    ports:
      - '9001:9001'
    volumes:
      - './backend/services/api:/services'
    environment:
      NODE_ENV: 'dev'
      port: '9001'
      BABEL_DISABLE_CACHE: 1
      DATABASE_URL: 'postgres://admin:admin@plan-analytics-postgres:5432/plan-analytics'
      DATABASE_TEST_URL: 'postgres://admin:admin@plan-analytics-postgres:5432/plan-analytics-integration'
    networks:
      - 'backend-net'
      - 'frontend-net'

  plan-analytics-web:
    container_name: plan-analytics-web
    build:
      context: ./client
    ports:
      - '3000:3000'
      - '35729:35729'
    environment:
      NODE_ENV: 'development'
      CHOKIDAR_USEPOLLING: 1
    volumes:
      - './client:/src/app'
      - '/src/app/node_modules'
    depends_on:
      - 'plan-analytics-postgres'
      - 'plan-analytics-services'
    networks:
      - 'frontend-net'

networks:
  frontend-net:
    driver: bridge
  backend-net:
    driver: bridge
  message-net:
    driver: bridge
Run Code Online (Sandbox Code Playgroud)

客户端和数据库的Dockerfiles按预期工作,但我没有运气,让我的api运行起来.我有一个类似的节点api设置,它的工作非常好.我想知道一些帮助,找出运行C#API的Dockerfile有什么问题.这是它的内容:

FROM microsoft/dotnet:2.1-sdk AS builder

RUN mkdir -p src/services
WORKDIR /services

# Add ./NuGet.config
COPY ./*.sln  ./



COPY src/*/*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p src/${file%.*}/ && mv $file src/${file%.*}/; done

# COPY test/*/*.csproj ./
# RUN for file in $(ls *.csproj); do mkdir -p test/${file%.*}/ && mv $file test/${file%.*}/; done

RUN dotnet restore

COPY ./src/api ./src/api
# COPY ./test ./test
RUN dotnet build -c Release --no-restore


# FROM build as publish
# WORKDIR /src/services/api
# RUN dotnet publish -c Release -o out

# Do the following when we add NuGet packages
# RUN dotnet build -c Release --no-restore
RUN dotnet publish "./src/api/api.csproj" -c Release -o "../../dist" --no-restore


# Build runtime image
FROM microsoft/dotnet:2.1.0
WORKDIR /services
COPY --from=build /services/dist .
ENTRYPOINT ["dotnet", "api.dll"]
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

Step 9/14 : RUN dotnet build -c Release --no-restore
 ---> Running in 47ffd4456e9d
Microsoft (R) Build Engine version 15.8.166+gd4e8d81a88 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

/usr/share/dotnet/sdk/2.1.402/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error NETSDK1004: Assets file '/Users/bryce/Documents/stacks/react-redux-to-net-core-postgres/backend/services/src/api/obj/project.assets.json' not found. Run a NuGet package restore to generate this file. [/services/src/api/api.csproj]

Build FAILED.

/usr/share/dotnet/sdk/2.1.402/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error NETSDK1004: Assets file '/Users/bryce/Documents/stacks/react-redux-to-net-core-postgres/backend/services/src/api/obj/project.assets.json' not found. Run a NuGet package restore to generate this file. [/services/src/api/api.csproj]
    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:00.54
ERROR: Service 'plan-analytics-services' failed to build: The command '/bin/sh -c dotnet build -c Release --no-restore' returned a non-zero code: 1
Run Code Online (Sandbox Code Playgroud)

Bry*_*den 1

所以我能够使上述工作正常运行...它部分与 --no-restore 有关,并且存在与之相关的错误。为了让它工作,我做了以下事情:

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /api

COPY ./*.sln ./
# COPY ./NuGet.config /root/.nuget/NuGet/

COPY src/*/*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p src/${file%.*}/ && mv $file src/${file%.*}/; done

# COPY test/*/*.csproj ./
# RUN for file in $(ls *.csproj); do mkdir -p test/${file%.*}/ && mv $file test/${file%.*}/; done

RUN dotnet restore

COPY . .

RUN dotnet publish -c Release -o out

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime
WORKDIR /api
COPY --from=build /api/src/api/out .
ENTRYPOINT ["dotnet", "api.dll"]
Run Code Online (Sandbox Code Playgroud)

我在上面的代码中留下了注释,以防您需要测试示例。