LINUX.ORG.RU

wineboot -u криво работает при сборке Докера

 ,


0

1

Если запустить wineboot -u в хостовой системе или в контейнере, он нормально отработает, в частности присвоит системные переменные, включая %ProgramFiles%.

Если запустить wineboot -u при сборке образа (RUN wineboot -u), он вроде бы отработает так же, но %ProgramFiles% останется пустой.

А без %ProgramFiles% не работает winetricks и не ставятся рантаймы VC. Можно это как-то обойти?

P.S. А если wine ставится в /opt, и пакет добавляет путь в PATH, путь в PATH не добавляется.

Debian:stable-slim, wine 1.8.7 (последний дебиановский) или 4.0 (последний стабильный на WineHQ).

Воркэраунд: wineboot -u && winetricks vcrun2005

Но после него опять не видит эти переменные.

Ответ 1: Каждая строка RUN выполняется в отдельном шелле, который завершается при выходе из последней команды в строке. Если какие-то из команд породили процессы, например, wineserver, эти процессы убиваются, и не успевают сохранить результаты. Добавление в конце строки wineboot -s не помогает, так как она тоже завершается до завершения wineserver. Необходимо дождаться завершения самого wineserver, например

RUN wineboot -i && wineserver -w

Но пока не решил, что делать с PATH.

Ответ 2: Похоже, сам пакет wine-stable не прописывает /opt/wine-stable/bin в PATH, и это следует делать вручную. Добавил соответствующую команду ENV.

Итого получился 3-гигабайтный образ вместо 14-гигабайтного с Windows. Возможно, стоит поставить какой-нибудь сервер X, чтобы избавиться от ошибок OLE.

★★★

Последнее исправление: olegd (всего исправлений: 7)

Ответ на: комментарий от olegd

А, нет, веселее. Иногда $HOME/.wine не создаётся, иногда создаётся, но без *.reg файлов. Похоже, Докер прибивает Вайн быстрее, чем Вайн успевает сохранить своё состояние.

olegd ★★★
() автор топика
Ответ на: комментарий от olegd

https://github.com/gpavlidi/dockerfiles/blob/master/wine/Dockerfile#L57

Автор ждёт, пока не завершится wineserver, запущеный от имени `whoami`:

WINEARCH=win32 WINEPREFIX=/root/.wine32 xvfb-run wine "wineboot" && while pgrep -u `whoami` wineserver > /dev/null; do sleep 1; done

Следует ставить ожидание завершения wineserver в конце каждой строки RUN, где вызывается wine. Стоит ли перед этим ставить wineboot -s, чтобы он гарантированно завершился?

olegd ★★★
() автор топика
Ответ на: комментарий от olegd

pgrep ставится из пакета procps. dpkg -S в помощь.

olegd ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.