From 0e663abb0a14b4a586d578e5a0fbe30e57ac8e16 Mon Sep 17 00:00:00 2001 From: b3ni15 Date: Mon, 7 Jul 2025 00:47:32 +0200 Subject: [PATCH] Refactor Dockerfile and entrypoint: switch to a new base image, streamline .NET SDK installation, and enhance entrypoint script for better environment setup --- Dockerfile | 134 ++++++++++++++++---------------------------------- README.md | 76 ---------------------------- build.sh | 21 -------- entrypoint.sh | 28 +++++++++++ 4 files changed, 70 insertions(+), 189 deletions(-) delete mode 100644 README.md delete mode 100644 build.sh create mode 100644 entrypoint.sh diff --git a/Dockerfile b/Dockerfile index 930a2dd..c0cc0d8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,101 +1,51 @@ -# Use Ubuntu as base image for better Wine support -FROM ubuntu:22.04 +FROM --platform=$TARGETOS/$TARGETARCH ghcr.io/parkervcp/yolks:debian -# Avoid interactive prompts during installation -ENV DEBIAN_FRONTEND=noninteractive +LABEL author="Torsten Widmann" maintainer="info@goover.de" -# Update system and install necessary packages including X11 for Wine -RUN apt-get update && apt-get install -y \ - software-properties-common \ - wget \ - curl \ - gnupg2 \ - ca-certificates \ - apt-transport-https \ - xvfb \ - x11-utils \ - x11-xserver-utils \ - dbus-x11 \ - && rm -rf /var/lib/apt/lists/* +ENV DEBIAN_FRONTEND=noninteractive -# Add Wine repository and install Wine 64-bit -RUN dpkg --add-architecture i386 \ - && mkdir -pm755 /etc/apt/keyrings \ - && wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key \ - && wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources \ - && apt-get update \ - && apt-get install -y --install-recommends winehq-stable \ - && apt-get install -y winetricks \ - && rm -rf /var/lib/apt/lists/* +RUN apt update -y \ + && apt upgrade -y \ + && apt install -y apt-transport-https wget curl iproute2 libgdiplus tini \ + && wget https://dot.net/v1/dotnet-install.sh \ + && D_V="$(curl -sSL https://dotnet.microsoft.com/en-us/download/dotnet/9.0 | grep -i '

SDK 9.*.*

' | head -1 | awk -F\" '{print $3}' | awk '{print $2;}' | sed 's/<\/h3>//g')" \ + && chmod +x dotnet-install.sh \ + && ./dotnet-install.sh -i /usr/share -v $D_V \ + && ln -s /usr/share/dotnet /usr/bin/dotnet -# Create a wine user to avoid running as root -RUN useradd -m -s /bin/bash -u 1000 wineuser -USER wineuser -WORKDIR /home/wineuser +# Install Wine and dependencies +RUN dpkg --add-architecture i386 \ + && apt update -y \ + && apt install -y software-properties-common gnupg2 \ + && wget -qO - https://dl.winehq.org/wine-builds/winehq.key | apt-key add - \ + && echo "deb https://dl.winehq.org/wine-builds/debian/ bullseye main" >> /etc/apt/sources.list.d/winehq.list \ + && apt update -y \ + && apt install -y winehq-stable \ + && apt install -y winetricks \ + && apt install -y xvfb \ + && apt clean \ + && rm -rf /var/lib/apt/lists/* +USER container +ENV USER=container HOME=/home/container -# Set Wine to 64-bit mode -ENV WINEARCH=win64 -ENV WINEPREFIX=/home/wineuser/.wine -ENV DISPLAY=:99 -ENV WINEDLLOVERRIDES="mscoree,mshtml=" -ENV WINEDEBUG=-all +# Wine environment variables +ENV WINEARCH=win64 +ENV WINEPREFIX=/home/container/.wine +ENV DISPLAY=:99.0 -# Create necessary directories and set up environment -USER root -RUN mkdir -p /tmp/.X11-unix /run/user/1000 \ - && chmod 1777 /tmp/.X11-unix \ - && chown wineuser:wineuser /run/user/1000 -USER wineuser +# Initialize Wine prefix as container user +RUN Xvfb :99 -screen 0 1024x768x16 & \ + export DISPLAY=:99.0 && \ + wine --version && \ + wineboot --init && \ + winetricks -q corefonts && \ + pkill Xvfb -# Set additional environment variables -ENV XDG_RUNTIME_DIR=/run/user/1000 +WORKDIR /home/container -# Create X11 directory and initialize Wine prefix -RUN Xvfb :99 -screen 0 1024x768x16 & \ - XVFB_PID=$! \ - && sleep 3 \ - && wineboot --init \ - && sleep 5 \ - && wineserver --wait \ - && kill $XVFB_PID || true +STOPSIGNAL SIGINT -# Install Wine dependencies for .NET -RUN Xvfb :99 -screen 0 1024x768x16 & \ - XVFB_PID=$! \ - && sleep 3 \ - && winetricks -q corefonts vcrun2019 \ - && wineserver --wait \ - && kill $XVFB_PID || true - -# Download .NET SDK -RUN cd /tmp \ - && wget --progress=bar:force https://builds.dotnet.microsoft.com/dotnet/Sdk/9.0.301/dotnet-sdk-9.0.301-win-x64.exe \ - && echo "Download completed, file size: $(ls -lh dotnet-sdk-9.0.301-win-x64.exe)" - -# Install .NET SDK with virtual display -RUN cd /tmp \ - && Xvfb :99 -screen 0 1024x768x16 & \ - XVFB_PID=$! \ - && sleep 3 \ - && wine dotnet-sdk-9.0.301-win-x64.exe /S || wine dotnet-sdk-9.0.301-win-x64.exe /quiet || wine dotnet-sdk-9.0.301-win-x64.exe \ - && wineserver --wait \ - && kill $XVFB_PID || true \ - && rm dotnet-sdk-9.0.301-win-x64.exe || true - -# Set environment variables for .NET -ENV DOTNET_ROOT="$WINEPREFIX/drive_c/Program Files/dotnet" -ENV PATH="$DOTNET_ROOT:$PATH" - -# Get dotnet version to verify installation -RUN Xvfb :99 -screen 0 1024x768x16 & \ - XVFB_PID=$! \ - && sleep 3 \ - && wine dotnet --version \ - && wineserver --wait \ - && kill $XVFB_PID || true - -# Set working directory for projects -WORKDIR /home/wineuser/projects - -# Default command -CMD ["/bin/bash"] +COPY --chown=container:container ./../entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh +ENTRYPOINT ["/usr/bin/tini", "-g", "--"] +CMD ["/entrypoint.sh"] \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 888ed37..0000000 --- a/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# Wine + .NET SDK Docker Image - -Ez a Docker image telepíti a Wine 64-bit verzióját és a Microsoft .NET SDK 9.0.301-et Windows-on keresztül. - -## Tartalom - -- Ubuntu 22.04 alapú image -- Wine 64-bit (stable verzió) -- .NET SDK 9.0.301 (Windows x64) - -## Build - -### Bash-sel (Git Bash, WSL, Linux, macOS): -```bash -chmod +x build.sh -./build.sh -``` - -### Manuálisan: -```bash -docker build -t wine-dotnet:latest . -``` - -## Használat - -### Alapvető futtatás: -```bash -docker run -it --rm wine-dotnet:latest -``` - -### Projektekkel való munka (volume mounting): -```bash -docker run -it --rm -v $(pwd)/projects:/home/wineuser/projects wine-dotnet:latest -``` - -Windows PowerShell-ben: -```powershell -docker run -it --rm -v ${PWD}/projects:/home/wineuser/projects wine-dotnet:latest -``` - -## .NET használata a containerben - -A containerben belül használhatod a .NET SDK-t a speciális script segítségével: - -```bash -# .NET verzió ellenőrzése -./run-dotnet.sh --version - -# Új projekt létrehozása -./run-dotnet.sh new console -n MyApp - -# Projekt build-elése -cd MyApp -../run-dotnet.sh build - -# Projekt futtatása -../run-dotnet.sh run -``` - -Alternatívaként közvetlenül is használhatod: -```bash -# Virtual display indítása -Xvfb :99 -screen 0 1024x768x16 & -export DISPLAY=:99 - -# .NET parancsok -wine dotnet --version -``` - -## Megjegyzések - -- A container egy `wineuser` felhasználóval fut (nem root) -- A Wine prefix előre konfigurálva van 64-bit módban -- A .NET SDK csendben telepítve van virtual display segítségével -- A projektek a `/home/wineuser/projects` könyvtárban tárolhatók -- A `run-dotnet.sh` script automatikusan kezeli a virtual display-t diff --git a/build.sh b/build.sh deleted file mode 100644 index 544adad..0000000 --- a/build.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -echo "Building Wine + .NET SDK Docker image..." -docker build -t wine-dotnet:latest . - -if [ $? -eq 0 ]; then - echo "✅ Docker image built successfully!" - echo "" - echo "To run the container interactively:" - echo "docker run -it --rm wine-dotnet:latest" - echo "" - echo "To run with volume mounting (for development):" - echo "docker run -it --rm -v \$(pwd)/projects:/home/wineuser/projects wine-dotnet:latest" - echo "" - echo "To run a .NET application with Wine:" - echo "docker run -it --rm -v \$(pwd)/projects:/home/wineuser/projects wine-dotnet:latest" - echo "Then inside the container: wine dotnet YourApp.dll" -else - echo "❌ Failed to build Docker image" - exit 1 -fi diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..4220dcb --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,28 @@ +#!/bin/bash +cd /home/container + +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP + +# set this variable, dotnet needs it even without it it reports to `dotnet --info` it can not start any aplication without this +export DOTNET_ROOT=/usr/share/ + +# Start Xvfb for Wine (virtual display) +Xvfb :99 -screen 0 1024x768x16 & +export DISPLAY=:99.0 + +# print the dotnet version on startup +printf "\033[1m\033[33mcontainer@pelican~ \033[0mdotnet --version\n" +dotnet --version + +# print the wine version on startup +printf "\033[1m\033[33mcontainer@pelican~ \033[0mwine --version\n" +wine --version + +# Replace Startup Variables +MODIFIED_STARTUP=$(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g') +echo -e ":/home/container$ ${MODIFIED_STARTUP}" + +# Run the Server +eval ${MODIFIED_STARTUP}