Рейтинг:1

Wine в Docker — «reg add» временно сохраняет эффекты

флаг cn

Я бился головой об стену по этому поводу.

Я хочу добавить исполняемый файл в PATH под вином в Ubuntu 20.04. Попытка настроить это из файла докеров, но возникла странная проблема. В частности, я пытаюсь установить python под вином, чтобы вы могли позвонить винный питон. Я решил попробовать использовать встроенный Python и вручную установить pip через get_pip.py (здесь не показано).

В Dockerfile у меня есть:

ИЗ убунту: 20.04

RUN useradd --no-log-init -r --uid 1003 -G dialout -g 100 -s /bin/bash jenkins

# ПОЛУЧИТЬ /wine/winecfg с предварительно настроенного частного сервера

ЗАПУСК dpkg --add-архитектура i386 \
    && получить обновление
    && получить установку -y \
    libc6:i386 \
    && получить установку -y \
    вино=5.0-3

RUN mkdir -p /wine/winecfg && chown -R jenkins:users /wine

# Добавляем встроенный Python
Архив Python_Embedded_Archive=python-3.9.7-embed-win32.zip
ВЫПОЛНИТЬ apt-get install -y разархивировать
COPY ${Python_Embedded_Archive} /temp/${Python_Embedded_Archive}
RUN unzip /temp/${Python_Embedded_Archive} -d /wine/python
ЗАПУСК chmod +x /wine/python/python.exe
БЕГИ chown jenkins:users /wine/python

# Переключиться на jenkins, которому принадлежит вино
ПОЛЬЗОВАТЕЛЬ Дженкинс: правда

# Добавляем встроенный Python в PATH в Wine
КОПИРОВАТЬ add_to_wine_path.sh /wine
ЗАПУСК bash /wine/add_to_wine_path.sh /wine/python \
    && винный питон --версия
ЗАПУСТИТЬ винный питон --версия

Примечание. Это не полный файл докера, а только соответствующие части.

Папка /wine/cfg находится в

С add_to_wine_path.sh:

path_to_add=$1
echo "Добавление '$path_to_add' в переменную PATH Wine"

# Очистить текущие значения пути (как правило, пустые, но скрипт может быть вызван во второй раз)
существующий_путь=$(винный регистр QUERY 'HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -v PATH | grep -Po '(?<=\^%).*(?=\^%)')

# Если существующее значение пути пусто
если [ -z $существующий_путь" ]
тогда
    # Установить значения пути по умолчанию (пути Windows)
    существующий_путь = "C:\windows\system32;C:\windows"
фи

wine reg add 'HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -v PATH /t REG_EXPAND_SZ /d ^%\;&path_to_add\;$existing_path^% /f

Что происходит на самом деле:
Когда я создаю образ докера, первый вызов винный питон --версия работает, указывая на то, что PATH был обновлен. УРА!
Но, когда второй винный питон --версия работает в другом БЕГ блокировать, не получается.

Мне кажется, что реестр необходимо принудительно обновить для всех пользователей в вине, фактически перезагрузка.

Так что я попытался винный сапог со всеми различными вариантами, и это все еще не помогло.

Любой гуру реестра Windows или Wine знает, что здесь происходит?

Рейтинг:1
флаг cn

Я также пытался сохранить изменение реестра вина в Docker и экспериментальным путем обнаружил, что в моей среде для файла реестра требуется от 1 до 2 секунд (~/.вино/user.reg) для изменения после вызова вино reg добавить.

Есть связанный запрос здесь. Надеюсь, есть способ синхронно сбросить реестр на диск; в противном случае проще всего будет зацикливаться до тех пор, пока файл не будет изменен.

Вот как я это сделал в одной ситуации (это изменение реестра включает опцию «Показать точечные файлы»):

ВЫПОЛНИТЬ до=$(stat -c '%Y' /home/xclient/.wine/user.reg) \
    && Wine reg add 'HKEY_CURRENT_USER\Software\Wine' /v ShowDotFiles /d Y \
    && while [ $(stat -c '%Y' /home/xclient/.wine/user.reg) = $before]; спать 1; сделано

Это наверное безопасно, потому что это единственное изменение в реестре по умолчанию (который не очень велик: по-видимому, всего 16 КБ), но в более сложных ситуациях могут возникнуть самые разные вещи:

  • Если вы вносите несколько изменений в реестр, они не могут быть одновременно сброшены на диск, поэтому просмотра даты изменения файла будет недостаточно.
  • Возможно, удастся выйти из цикла, пока файл все еще записывается на диск, поэтому вы получите поврежденный файл реестра.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.