I wrote a small demo to understand microservices and DDD. This is the file structure.
├───.dockerignore
├───docker-compose.yml
├───Dockerfile
├───MicroserviceDemo.sln
├───MicroserviceDemo.Application
│ ├───MicroserviceDemo.Application.csproj
│ └───...
├───MicroserviceDemo.Domain
│ ├───MicroserviceDemo.Domain.csproj
│ └───...
└───MicroserviceDemo.Infrastructure
├───MicroserviceDemo.Infrastructure.csproj
└───...
If I run docker compose, the container run fine but I get a 404 when navigating to localhost:5000/swagger.
I tried creating another dockerfile (using VS docker tools), at the application directory, which resulted in normal behavior when running that container (I get the swagger ui). The application also works fine when debugging without dockers running directly on my local with VS).
I am not really sure where the problem could be.
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MicroserviceDemo.Application/MicroserviceDemo.Application.csproj", "MicroserviceDemo.Application/"]
COPY ["MicroserviceDemo.Infrastructure/MicroserviceDemo.Infrastructure.csproj", "MicroserviceDemo.Infrastructure/"]
COPY ["MicroserviceDemo.Domain/MicroserviceDemo.Domain.csproj", "MicroserviceDemo.Domain/"]
RUN dotnet restore "MicroserviceDemo.Application/MicroserviceDemo.Application.csproj"
COPY . .
WORKDIR "/src/MicroserviceDemo.Application"
RUN dotnet build "MicroserviceDemo.Application.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MicroserviceDemo.Application.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MicroserviceDemo.Application.dll"]
docker-compose.yml
version: '3'
services:
infrastructure:
image: "mcr.microsoft.com/mssql/server"
container_name: microservice-demo-database
restart: always
environment:
SA_PASSWORD: "Your_password123"
ACCEPT_EULA: "Y"
ports:
- 5432:5432
rabbitmq:
image: rabbitmq:3-management
container_name: microservice-demo-rabbitmq
ports:
- 5672:5672
- 15672:15672
environment:
- RABBITMQ_DEFAULT_USER=user
- RABBITMQ_DEFAULT_PASS=password
api:
image: microservice-demo:latest
build: .
container_name: microservice-demo-api
restart: always
depends_on:
- infrastructure
- rabbitmq
ports:
- 5000:80
- 5001:443