InitContainer with Entity Framework Core and Oracle

Bjego
2 min readNov 8, 2023

--

When you are using Entity Framework Core and Oracle, you may want to create an InitContainer for Kubernetes to handle your Database migrations.

Multistage Dockerfile

ARG VERSION=0.1.0
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 8080
ENV ASPNETCORE_URLS=http://+:8080


FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
ARG VERSION
ARG configuration=Release
WORKDIR /src
COPY . .
WORKDIR "/src/SOMEPROJECT"
RUN dotnet restore "SOMEPROJECT.csproj"
RUN dotnet build "SOMEPROJECT.csproj" -c $configuration -o /app/build -p:Version=${VERSION}

FROM build as migrationbuilder
ENV PATH $PATH:/root/.dotnet/tools
RUN dotnet tool install --global dotnet-ef
RUN mkdir /migrations
RUN dotnet ef migrations bundle --self-contained -r linux-x64 -o /migrations/migration
RUN cp ./initentrypoint.sh /migrations/initentrypoint.sh

FROM mcr.microsoft.com/dotnet/runtime:7.0 as initcontainer
ENV CONNECTIONSTRING="User Id=ORACLEUSER;Password=ORACLEPASSWORD;Data Source=db:1521/FREEPDB1;"
COPY --from=migrationbuilder /migrations /migrations
COPY --from=migrationbuilder /src/src/AksPoc/appsettings.json /migrations/appsettings.json
RUN chmod 755 /migrations/migration
RUN chmod 755 /migrations/initentrypoint.sh
WORKDIR /migrations
ENTRYPOINT [ "./initentrypoint.sh" ]

FROM build AS publish
ARG configuration=Release
RUN dotnet publish "SOMEPROJECT.csproj" -c $configuration -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SOMEPROJECT.dll"]

Initscript

#!/bin/bash
./migration --connection "$CONNECTIONSTRING"

How to build the InitContainer

docker build --target initcontainer -t initcontainer:latest .

How to build the application container

docker build -t appcontainer:latest .

How does it work

To build an InitContainer you just need to add 2 new Stages in your DockerFile.

Stage 1 — Migrationbuilder:

This stage is using the .net sdk and installing the dotnet-ef tools to build a migration bundle.

Stage 2 — Initcontainer

This stage holds the code to run your migrations in kubernetes. It can be build by setting the option target in the docker build:

--target initcontainer

When you now run your initcontainer you simply need to set the environment variable “CONNECTIONSTRING” to a valid oracle .net connectionstring.

Good to know:

  • Migrationbundles need a valid appsettings.json next to the migration bundle
  • You should mount a tnsnames.ora into the container
  • You should set the environment variable TNS_ADMIN to point to the folder containing tnsnames.ora
  • The initscript is launching the migration with the connectionstring from your environment variable “CONNECTIONSTRING”

--

--

No responses yet