diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1b5064a --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +**/appsettings.Development.json diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6d21e88 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 as builder + +COPY . /ModShark +WORKDIR /ModShark + +RUN dotnet publish ModShark.sln + + +FROM mcr.microsoft.com/dotnet/runtime:8.0 + +# Install jq and use Docker caching for package downloads +ENV DEBIAN_FRONTEND=noninteractive +RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=locked \ + --mount=target=/var/cache/apt,type=cache,sharing=locked \ + rm -rf /etc/apt/apt.conf.d/docker-clean && \ + apt-get update && apt-get install -y jq + +# Add modshark user and copy built modshark +RUN useradd -m -s /bin/bash modshark +COPY --from=builder --chown=modshark:modshark /ModShark/ModShark/bin/Release/net8.0/publish/ /ModShark +COPY --from=builder --chown=modshark:modshark /ModShark/SharkeyDB/bin/Release/net8.0/publish/ /SharkeyDB +COPY --from=builder --chown=modshark:modshark /ModShark/entrypoint.sh /entrypoint.sh + +USER modshark +WORKDIR /ModShark + +# Start ModShark at container startup +ENTRYPOINT [ "/entrypoint.sh" ] +CMD [ "dotnet", "/ModShark/ModShark.dll" ] diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..ddf1cf4 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,21 @@ +#!/bin/bash +if [[ $# > 0 ]]; then + tmpfile=$(mktemp) + vars=() + while IFS='=' read -r -d '' n v; do + if [[ $n == "MODSHARK__"* ]]; then + vars+=("$(printf "%s=%s" "$n" "$v")") + fi + done < <(env -0) + + for var in "${vars[@]}"; do + item=$(echo "${var}" | grep ^MODSHARK__ | sed s/^MODSHARK__/./g | sed s/__/./g) + key=$(echo "${item}" | cut -d "=" -f 1) + value=$(echo "${item}" | cut -d "=" -f 2-) + jq $key="\"$value\"" appsettings.json > $tmpfile && \ + mv $tmpfile appsettings.json + done + exec $@ +else + /bin/bash +fi