Hosting

Hosting

Hosting with Docker

Docker allows to build, package and run your applications developed with GenHTTP on any server, whether it is on your NAS at home or a Kubernetes cluster in the cloud.

As GenHTTP is built on top of .NET, we can use the base images provided by Microsoft to setup our build chain. For a list of available base images, see their Docker Hub page.

Building Template Apps

If you created your application using a project template, you will see that matching Docker files have already been created. Building and running your app is as easy as:

# creates an image named "myproject"
docker build -f Dockerfile.linux-x64 -t myproject .

# runs your application
docker run -p 8080:8080 -d myproject

You should be able to access your app via http://localhost:8080. If you run those commands on the machine you would like to host your application on (e.g. a Linux server) you will not need to install the .NET SDK or any other dependencies besides Docker itself.

Creating a new Dockerfile

If you did not use a project template, create a new file named Dockerfile in the root directory of your repository. The following example is for an x64 image running on Linux:

FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY Project/*.csproj .
RUN dotnet restore -r linux-musl-x64

# copy and publish app and libraries
COPY Project/ .
RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore /p:PublishTrimmed=true /p:TrimMode=Link

# final stage/image
FROM mcr.microsoft.com/dotnet/runtime-deps:8.0-alpine-amd64
WORKDIR /app
COPY --from=build /app .

ENTRYPOINT ["./Project"]

EXPOSE 8080

This assumes that you named your project Project. With this file you can use the commands in the previous section to build and run your project.

Managing dependencies

Typically your web application will have some dependencies such as databases or a redis server. docker compose allows you to define and maintain the whole infrastructure needed by your app in a single file.

Share