1

Ive been bashing my head against a wall about this.

I'm looking to add an executable to the PATH under wine on Ubuntu 20.04. Trying to configure this from the dockerfile, but having a weird issue. Specifically, i'm trying to install python under wine such that you can call wine python. I have opted to try using embedded python and manually installing pip through get_pip.py (Not shown here).

In the Dockerfile, I have:

FROM ubuntu:20.04

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

# PULL /wine/winecfg from private server pre-configured

RUN dpkg --add-architecture i386 \
    && apt get update
    && apt get install -y \
    libc6:i386 \
    && apt get install -y \
    wine=5.0-3

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

# Add Embedded Python
ARG Python_Embedded_Archive=python-3.9.7-embed-win32.zip
RUN apt-get install -y unzip
COPY ${Python_Embedded_Archive} /temp/${Python_Embedded_Archive}
RUN unzip /temp/${Python_Embedded_Archive} -d /wine/python
RUN chmod +x /wine/python/python.exe
RUN chown jenkins:users /wine/python

# Switch to jenkins, which owns wine
USER jenkins:true

# Add Embedded Python to PATH in wine
COPY add_to_wine_path.sh /wine
RUN bash /wine/add_to_wine_path.sh /wine/python \
    && wine python --version
RUN wine python --version

Note: This not the full dockerfile, just the relevant parts

The /wine/cfg folder is f

With add_to_wine_path.sh:

path_to_add=$1
echo "Adding '$path_to_add' to Wine's PATH variable"

# Get clean the current path values (generally empty, but script could be called a second time)
existing_path=$(wine reg QUERY 'HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -v PATH | grep -Po '(?<=\^%).*(?=\^%)')

# If the existing path value is empty
if [ -z $existing_path" ]
then
    # Set the default path values (Windows paths)
    existing_path="C:\windows\system32;C:\windows"
fi

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

What actually happens:
When I build the docker image, the first call to wine python --version works, indicating that the PATH was updated. YAY!
But, when the second wine python --version runs in a different RUN block, it fails.

This seems to me like the registry needs to be forced to update for all users in wine, effectively a reboot.

So I tried wineboot with all the various options and that still didn't help.

Any Windows Registry or Wine gurus know whats going on here?

Awbmilne
  • 11
  • 1

1 Answers1

1

I've been trying to persist a wine registry change in Docker too, and I found through experimentation that in my environment it takes between 1 and 2 seconds for the registry file (~/.wine/user.reg) to be modified after invoking wine reg add.

There is a related query here. Hopefully there is a way to synchronously flush the registry to disk; otherwise the easiest thing might be to loop until the file is modified.

Here is how I did it in one situation (this registry change enables the "Show dot files" option):

RUN before=$(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 ]; do sleep 1; done

This is probably safe because it's a single change to the default registry (which is not very large: only 16KB apparently), but all sorts of things could go wrong in more complex situations:

  • If you make multiple modifications to the registry, they may not all be flushed to disk at the same time, so looking at the file modification date would be insufficient
  • It might be possible to exit the loop while the file is still being written to disk, so you would end up with a corrupt registry file
Aaron
  • 111
  • 3