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?
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 invokingwine 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):
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: