Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dotnet watch run in container with multi-project solution

I'm trying to create a Dockerfile along with a docker-compose.yml file to run dotnet watch run on a multi project ASP.Net Core solution. The goal is to have a container watching for changes in all of the three projects.

My solution structure is this:

Nc.Application
Nc.Domain
Nc.Infrastructure
docker-compose.yml

Nc.Application contains the main project to run, and the other two folders are .Net standard projects referenced by the main project. Inside Nc.Application i have a folder, Docker, with my dockerfile.

Controllers
Docker
  Development.Dockerfile
Properties
Program.cs
Startup.cs
...

My Dockerfile and compose file contains the following:

Development.Dockerfile

FROM microsoft/dotnet:2.1-sdk AS build
ENTRYPOINT [ "dotnet", "watch", "run", "--no-restore", "--urls", "http://0.0.0.0:5000" ]

docker-compose.yml

version: '3'

services:

  nc.api:
    container_name: ncapi_dev
    image: ncapi:dev
    build:
      context: ./Nc.Application
      dockerfile: Docker/Development.Dockerfile
    volumes:
      - ncapi.volume:.
    ports:
      - "5000:5000"
      - "5001:5001"

volumes:
  ncapi.volume:

When i try to run docker-compose up i get the following error:

ERROR: for f6d811109779_ncapi_dev  Cannot create container for service nc.api: invalid volume specification: 'nc_ncapi.volume:.:rw': invalid mount config for type "volume": invalid mount path: '.' mount path
must be absolute

ERROR: for nc.api  Cannot create container for service nc.api: invalid volume specification: 'nc_ncapi.volume:.:rw': invalid mount config for type "volume": invalid mount path: '.' mount path must be absolute
ERROR: Encountered errors while bringing up the project.

I don't know what the path for the volume should be, as the idea is to create a container not directly containing files, but watching files in a folder on my system.

Does anyone have any suggestions as to how to go about this?

EDIT:

I updated WORKDIR in Dockerfile to /app/Nc.Application, updated the volume path to be ./:/app and removed the named volume volumes: ncapi.volume. However, i now receive the following error:

ncapi_dev | watch : Polling file watcher is enabled
ncapi_dev | watch : Started
ncapi_dev | /usr/share/dotnet/sdk/2.1.403/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error NETSDK1004: Assets file '/app/Nc.Application/c:/Users/Christian/Documents/source/nc/Nc.Application/obj/project.assets.json' not found. Run a NuGet package restore to generate this file. [/app/Nc.Application/Nc.Application.csproj]
ncapi_dev |
ncapi_dev | The build failed. Please fix the build errors and run again.
ncapi_dev | watch : Exited with error code 1
ncapi_dev | watch : Waiting for a file to change before restarting dotnet...
like image 785
Mike Hawkins Avatar asked Nov 10 '18 12:11

Mike Hawkins


1 Answers

Update: The latest VS Code Insiders introduced Remote Development which allows you to directly work inside a container. Worth checking this out.


You shouldn't mount things at the root of the container. Use another mount point like /app. Also, you don't need a named volume but a bind mount for this situation.

Make changes like this

Development.Dockerfile

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /app
ENTRYPOINT [ "dotnet", "watch", "run", "--no-restore", "--urls", "http://0.0.0.0:5000" ]

docker-compose.yml

version: '3'

services:

  nc.api:
    container_name: ncapi_dev
    image: ncapi:dev
    build:
      context: ./Nc.Application
      dockerfile: Docker/Development.Dockerfile
    volumes:
      - ./:/app
    ports:
      - "5000:5000"
      - "5001:5001"
like image 121
Pramodh Valavala Avatar answered Oct 09 '22 02:10

Pramodh Valavala