docker 컨테이너에서 WineHQ 실행
좋아요.
지금 이것은 결코 완전히 사실이 아니다...
이 해결 방안도 가장 좋은 것은 아니다.
그러나 내가 개인 자료에서 말한 바와 같이 나는 단지 궁금할 뿐이다.
루터스, 심지어 스팀의proton 같은 도구는 더 간단하고 빠른 방식으로 네이티브 linux 포트가 없는 게임을 하고 있다.
나는 두 가지를 모두 시험해 보았지만, 모두 쓸모가 있다.사실이야.나는 힘들이지 않고 내가 원하는 게임을 할 수 있다.
사실 내가 내 시스템에 얼마나 많은 물건이 설치되어 있는지, 그리고 내가 매일 진정으로 얼마나 많은 물건을 필요로 하는지 생각할 때, 이 문제는 항상 내 머릿속에 떠오른다.더 나아가, 내가 발행판을 변경하거나 다시 설치해야 할 때, 나는 무엇을 놓칠 수 있다.
이 점을 감안하여 나는 용기를 시험해 보기 시작했다.설령 단지 많든 적든 깨끗한 방식으로 새로운 wine 버전을 테스트한다 하더라도, 나는 이미 새로운 버전으로 업그레이드되었기 때문에, 불행하게도, 이 버전은 파괴되어서, 어쩔 수 없이 이전의 작업 버전 패키지를 다시 설치해야 한다.
그래서 저는 Ubuntu 초점 용기에서 몇 가지 물건을 구축하고 두 개의 용기로 나누기로 했습니다.
더 많은 세부 사항을 깊이 있게 토론하기 전에, Dockerfiles에 심상치 않은 점이 있음을 알아차린다면, 이 구축 시스템이 이미 준비가 되어 있기 때문이다.그러나 그것들도 전통적인
docker build
cmd로 정상적으로 구축할 수 있다.--build arg 플래그를 사용하여 기본값을 덮어쓸 수 있습니다.또한 호스트에 설치된 드라이버 버전이 컨테이너에 설치된 드라이버 버전과 동일한지 확인하십시오.
기본 용기
ARG UBUNTU_VERSION=focal
ARG NVIDIA_DRIVER_VERSION=450
FROM ubuntu:$UBUNTU_VERSION
ARG UBUNTU_VERSION
ARG NVIDIA_DRIVER_VERSION
ENV DEBIAN_FRONTEND=noninteractive
ENV UBUNTU_VERSION=$UBUNTU_VERSION
ENV NVIDIA_DRIVER_VERSION=$NVIDIA_DRIVER_VERSION
ENV PKGNV="nvidia-driver-${NVIDIA_DRIVER_VERSION} libnvidia-gl-${NVIDIA_DRIVER_VERSION}:i386"
ENV PKGVK="libvulkan1 libvulkan1:i386 vulkan-tools vulkan-utils"
RUN dpkg --add-architecture i386 && \
apt update && \
apt install -y gnupg2 apt-transport-https curl
RUN apt install -y $PKGNV $PKGVK
따라서 이것은 첫 번째 용기입니다. ubuntufocal 버전과 nvidiadrivers450(기본적으로), vulkan, 그리고 잠시 후에 사용할 기본 도구를 기반으로 합니다.다음 단계에서 나는 그것을 ubuntu-nvidia-vlk:focal
라고 부른다.포도주 용기
FROM ubuntu-nvidia-vlk:focal
ARG WVERSION="5.17"
ARG WTVERSION="20200412"
ENV WINE_VERSION="${WVERSION}"
ENV PKG_WINE_VERSION="${WVERSION}~${UBUNTU_VERSION}"
ENV WINE_TRICKS_VERSION="${WTVERSION}"
RUN curl -s https://dl.winehq.org/wine-builds/winehq.key | apt-key add - && \
echo "deb https://dl.winehq.org/wine-builds/ubuntu/ ${UBUNTU_VERSION} main" | tee /etc/apt/sources.list.d/wine.list && \
apt update && \
apt install -y winbind cabextract wget fonts-wine ttf-mscorefonts-installer\
winehq-staging=$PKG_WINE_VERSION \
wine-staging=$PKG_WINE_VERSION \
wine-staging-i386=$PKG_WINE_VERSION \
wine-staging-amd64=$PKG_WINE_VERSION
ADD https://github.com/Winetricks/winetricks/archive/${WINE_TRICKS_VERSION}.zip /tmp/wt.zip
RUN unzip /tmp/wt.zip -d /tmp/ && \
cp /tmp/winetricks-${WINE_TRICKS_VERSION}/src/winetricks /usr/local/bin && \
rm -Rf /tmp/*
우리는 우리의 winehq:5.17 용기라고 할 수 있다.우리는 기본 용기와 포도주 용기가 하나 있다.
대부분의 게임이
winbind
와cabextract
가 필요하기 때문에 나는 그것들을 포도주와 함께 두기로 결정했다.이니시에이터/로드기에 많이 사용되기 때문에 글꼴 패키지도 있습니다.나는 내가 필요로 하는 소프트웨어 패키지를 위해 다른 무대를 세울 수 있다고 생각하지만, 나는 아직 그것들을 놓을 가장 좋은 무대를 찾을 시간이 없다.
그래서 이제 우리는 커다란 명령줄을 기억하지 않기 위해 발자국을 만들 필요가 있다.
이 때, 우리는 이 줄을 dockerfile에 추가해서 dxvk 용기에 추가할 수 있습니다
ARG DXVKVERSION="1.7.1"
ENV DXVK_VERSION="${DXVK_VERSION}"
ADD https://github.com/doitsujin/dxvk/releases/download/v${DXVK_VERSION}/dxvk-${DXVK_VERSION}.tar.gz /tmp/dxvk.tar.gz
... 하지만 DXVK는 winetricks를 통해 설치할 수도 있습니다.그래서 저는 지금 winetricks 방법을 사용합니다.우리는 언제든지 용기를 시작할 수 있도록 이 스크립트를 경로 디렉터리에 추가할 수 있습니다.
또한 모든 버전을 환경 변수로 용기에 넣는 것은 개인적인 선호일 뿐이기 때문에 필요할 때 신속하게 검사할 수 있습니다.
$HOME/tmp 경로에 임시 폴더를 만들고 용기 내의 $HOME으로 사용합니다.또한 현재 경로 (또는 WINEPREFIX) 는 $HOME/game의 컨테이너에 배치됩니다.
나는 어쩔 수 없이 이렇게 해야 한다. 왜냐하면.Xauthority 파일은 homedir에 마운트됩니다. 볼륨이기 때문에 두 가지 일이 발생할 수 있습니다.
1 - WINEPREFIX를 마스터 디렉토리로 설정한 경우.Xauthority 파일은 호스트의 위치로 복사됩니다.
2 - 홈 디렉터리가 존재하지 않으면 사용자
root
(용기 기본 사용자) 가 만들 것입니다. 이로 인해 일부 프로그램은 홈 디렉터리를 기본 위치로 사용하여 자신의 파일 (예를 들어 winetricks) 을 작성할 수 있습니다.#!/bin/bash
curdir="$(pwd)"
vhome="${HOME}/tmp/.winestorage"
if [ ! -d "$vhome" ]; then
echo "creating $vhome"
mkdir -p $vhome
fi
docker run --rm \
--name wine \
-u $(id -u):$(id -g) \
-e DISPLAY \
-e WINEPREFIX=/wine/game \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e PULSE_SERVER=unix:/pulse \
-e HOME=/wine \
-v $HOME/.Xauthority:/wine/.Xauthority \
-v /run/user/$(id -u)/pulse/native:/pulse \
--device /dev/nvidia0:/dev/nvidia0 \
--device /dev/nvidiactl:/dev/nvidiactl \
--device /dev/nvidia-uvm:/dev/nvidia-uvm \
--device /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools \
--device /dev/nvidia-modeset:/dev/nvidia-modeset \
-v ${vhome}:/wine \
-v ${curdir}:/wine/game \
-ti \
winehq:5.17 \
bash
이 스크립트는 다음과 같은 몇 가지 고려 사항이 있습니다.--rm
-u $(id -u):$(id -g)
-e WINEPREFIX=/wine/game
, my HOME을/wine-e HOME=/wine
-v /tmp/.X11-unix:/tmp/.X11-unix
에 마운트합니다.-e PULSE_SERVER=unix:/pulse
를 정의하고 실제 플러그인을 용기에 넣습니다-v /run/user/$(id -u)/pulse/native:/pulse
-v $HOME/.Xauthority:/wine/.Xauthority
현재 용기에서 우리는 직접
/wine/game
로 이동하여 우리가 실행하고자 하는 내용을 설치하거나 재생할 수 있다.추가 패키지를 설치해야 할 물건을 설치하려고 시도할 때, 루트로 용기를 입력하고
docker exec -u root -ti wine bash
실행하기만 하면 우리가 필요로 하는 물건을 설치할 수 있는 새로운 셸을 열 수도 있습니다.포도주를 사용하는 것은 이 글의 진정한 목표가 아니지만, 인터넷에는 이 점을 도울 충분한 정보가 있다.winetricks를 설치하면 접두사를 설정하는 데 도움을 줄 수 있습니다.
내 동기 중 하나는 이 디렉터리 구조 ($vhome 경로) 를 사용하여 winetricks에 캐시를 다운로드하고 유지하려고 하는 것이다.
나는 이런 방법을 써서 전투를 일으킨 적이 있다.net는 효과가 매우 좋은 몇 가지 게임을 시도했다.
나는 에픽 게임 스토어도 운영할 수 있지만, 불행하게도 나는 그곳에서 몇 가지 게임을 했지만 운이 없었다.나는 나의 접두사에 약간의 물건이 없어졌다고 생각한다.
마지막으로 전쟁 게임을 할 수 있는 게임 센터를 설치하고 탱크 세계를 몇 바퀴 돌 수 있다.
이 점에서 대부분의 필요한 작업은 접두사에 어떤 의존항을 사용해야 하는지, 그리고 어떤 포도주 창고를 덮어야 하는지 찾아내는 것이다.Lutris 설치 스크립트는 주어진 게임에 대한 더 많은 정보를 찾기에 적합하다.
여전히 오류가 발생하지만, wine 디버깅 메시지는 일부 문제를 추적하고, 우리가 설치해야 할 잃어버릴 수 있는 소프트웨어 패키지를 찾을 수 있도록 도와줍니다.
보안 문제
나는 이런 방법의 안전 결함을 깊이 연구하지 않을 것이다.
아리 칼포스는 그의 자리에서 이미 잘했다.GUI 프로그램을 실행하는 것을 고려하지 않아도 읽을 만하다.
그러면 다음 몇 가지 효과적인 문제를 해결하기 위해 시작 스크립트를 조정해 보겠습니다.
#!/bin/bash
curdir="$(pwd)"
vhome="${HOME}/tmp/.winestorage"
if [ ! -d "$vhome" ]; then
echo "creating $vhome"
mkdir -p $vhome
fi
docker run --rm \
--cap-drop=all \
--name wine \
-u $(id -u):$(id -g) \
-e DISPLAY \
-e WINEPREFIX=/wine/game \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-e PULSE_SERVER=unix:/pulse \
-e HOME=/wine \
-v $HOME/.Xauthority:/wine/.Xauthority:ro \
-v /run/user/$(id -u)/pulse/native:/pulse \
--device /dev/nvidia0:/dev/nvidia0 \
--device /dev/nvidiactl:/dev/nvidiactl \
--device /dev/nvidia-uvm:/dev/nvidia-uvm \
--device /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools \
--device /dev/nvidia-modeset:/dev/nvidia-modeset \
-v ${vhome}:/wine \
-v ${curdir}:/wine/game \
-ti \
winehq:5.17 \
bash
우리가 --cap-drop=all
를 추가할 때, 작업을 멈추는 일 중 하나는 용기를 root
로 입력하고 용기 시스템의 모든 내용을 변경할 수 있다는 것을 기억하십시오.물론, linux에서 게임을 하는 것은 더욱 간단한 방법이 있지만, 이것은 나에게 있어서 좋은 일이다. 이렇게 하면 나는 호스트 시스템에 설치되어 있지 않은 많은 소프트웨어 패키지에서 벗어날 수 있다.
AMD나 Intel 그래픽에서 실행할 수 있도록 이 글을 개선할 수 있지만, 지금은 할 수 없습니다.
Reference
이 문제에 관하여(docker 컨테이너에서 WineHQ 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/flpslv/running-winehq-inside-a-docker-container-52ej텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)