An F# eXchange 2018 workshop
Based on docs from https://github.com/dotnet/dotnet-docker-samples
Three workflow:
sdk docker image, build and run inside containersdk docker image to build, and use runtime image to run itUse workflow 2, build with sdk and run with runtime image
This is supported by multi staged docker build
In a sample4 directory.
first, let’s create a console app, run:
dotnet new console -lang f#
Now create a Dockerfile:
FROM microsoft/dotnet:2-sdk AS build-env
WORKDIR /app
# copy fsproj and restore as distinct layers
COPY *.fsproj ./
RUN dotnet restore
# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# build runtime image
FROM microsoft/dotnet:2-runtime
WORKDIR /app
COPY --from=build-env /app/out ./
ENTRYPOINT ["dotnet", "sample4.dll"]
The COPY will copy all files, so let’s exclude temp dir who can exists locally
Add a .dockerignore file with
bin/
obj/
out/
and build it
docker build -t sample4 .
and run it
docker run --rm sample4 "from inside docker"
Let’s use suave, with workflow 3
In a sample4 directory.
first, let’s create a console app
dotnet new console -lang f#
And add Suave
dotnet add package Suave
Now add suave code in main
with open Suave and
startWebServer
{ defaultConfig with
bindings = [ HttpBinding.create HTTP System.Net.IPAddress.Any 8083us ] }
(Successful.OK "Hello World!")
we can try locally with dotnet run, who will create a server listening to 0.0.0.0:8083
and that’s exposed to host at http://127.0.0.1:8083
Now the Dockerfile
FROM microsoft/dotnet:2-sdk AS build-env
WORKDIR /app
# copy fsproj and restore as distinct layers
# COPY nuget.config ./
COPY *.fsproj ./
RUN dotnet restore
# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -r linux-x64 -o out
# build runtime image
FROM microsoft/dotnet:2-runtime-deps
WORKDIR /app
COPY --from=build-env /app/out ./
ENTRYPOINT ["./sample5"]
And the .dockerignore
bin/
obj/
out/
Now build
docker build -t sample5 .
and run
docker run --rm -p 8083:8083 sample5