Этот проект демонстрирует экспериментальный способ запуска WPF-приложений (.NET Framework или .NET Core) внутри Docker-контейнера с использованием Wine — совместимого слоя Windows API для Unix-систем.
⚠️ Важно: WPF — это технология, которая офицально не поддерживается на Linux. Однако с помощью Wine можно попытаться запустить такие приложения в изолированной среде. Данное решение предназначено в первую очередь для тестирования, образовательных целей или специфических сценариев. Простые приложения могут запуститься, но сложный UI скорее всего нет, либо придется как-то докачивать зависимости.
Зачем вам это, когда уже есть Avalonia я не знаю. Но мне дали такое задание как дополнительное в моем техникуме по Docker'у. Многие пишут: «You cannot run a WPF application in docker.». Я проверил: возможно, но больно.
Я изрядно помучался, поднял 1000 и 1 контейнер, прочитал тонну статей на StackOverflow и других сайтах, где явно писали 'это невозможно'. Смотрел YouTube. Пытался гуглить на английском, хинди и китайском безрезультатно.
Была идея использовать dockur/windows, но мне не подходила необходимость в KVM и огромный размер образа. В итоге, благодаря Scotty Hardy и его образу docker-wine, я смог запустить WPF в Docker, сначала на .NET Framework, потом через Alpine, и наконец — на .NET Core." Чтобы больше никто не мучался был и создан этот репозиторий.
- Docker Desktop - демон docker'а.
- Xming - для отображения GUI. Можно взять любой другой X-сервер.
- NET Framework - я не знаю возможно ли запустить на NET Core, но лично я пробовал на NF 4.7.2 и NF 4.8.
- Скомпилированное WPF-приложение с
.exe(например,WpfApp.exe) - dotnet - установленный dotnet на хост машине нужной версии (той же что и ваше приложение). Этот пункт только если вы запускаете .NET Core.
- Убедитесь, что ваше WPF-приложение скомпилировано и содержит исполняемый
.exeфайл (например,WpfApp.exe). - Можете удалите мои тестовые WPF приложения.
- Добавьте в корень проекта ваше приложение, где также будет .exe.
- Запустите Docker Desktop и Xming если еще это не сделали.
Выполните в корне проекта:
.NET Framework
# Вариант 1: На основе образа scottyhardy/docker-wine
docker build -f Dockerfile.docker-wine -t wpf-app .
# Вариант 2: На основе Alpine (меньше размер)
docker build -f Dockerfile.alpine -t wpf-app ..NET Core
docker build -f Dockerfile.alpine-core -t core-alpine ..NET Framework
docker run --rm wpf-app.NET Core
docker run -it --rm --name core-alpine-container core-alpine /bin/sh
# В запущенном контейнере в sh введем winecfg, который создаст диск C:\
winecfg
# В отедльном терминале cкопируем наш dotnet с хост машины в контейнер диска C.
docker cp "C:\Program Files\dotnet" core-alpine-container:"/root/.wine/drive_c/Program Files/dotnet"
# После чего снова в контейнере через sh запускаем приложение через wine, которое подтянет NET Core, который мы переместили в Program Files
wine /app/WPFCore.exe- Графический интерфейс может отображаться некорректно или медленно.
- Мышь и клавиатура могут работать нестабильно — используйте клавиши
TabиEnterдля навигации по элементам. Или поищите зависимости, которые нужно установить, чтобы исправить это. - Wine не поддерживает все функции WPF. Приложения с тяжёлой графикой, анимациями или сторонними библиотеками могут не запуститься.
- Для более сложных сценариев может потребоваться установка дополнительных компонентов через
winetricks.
✅ Альтернатива: Если вы разрабатываете новое приложение, рассмотрите переход на .NET 6/8 с Avalonia UI или MAUI, которые поддерживают кроссплатформенную разработку с нативным UI.
