DocEkerコンテナ内でのWinehEQの実行


(私があなたの時間を無駄にする前に、私がこのポストが私のシステムにあるNVIDIA GPUを使用して行われたと警告することから始めさせてください.残念なことに、私は、AMDまたはインテルGPUでこれを正しくテストする手段(時間)を持っていません.」

まあ
最近、これは正確ではない.
また、この解決策は最高です.
しかし、私が私のプロフィールで言ったように、私はちょうど好奇心旺盛です.
物事は進化している、ルトリスやスチームのプロトンのようなツールは、ネイティブのLinuxポートを持っていないゲームをプレイするより簡単で高速な方法を提供しています.
私は、ちょうど両方のものを試みました.それは事実だ.そして、私は大きな努力なしに欲しい(支えられた)ゲームをすることができました:
  • With Lutris , 私はちょうどサイトに行って、私が欲しかったゲームのために予め設定されたインストーラを引っ張って、それが魔法であると働かせました.
  • With Steam Proton , 私はちょうどゲームをダウンロードし、それを再生しなければならなかった.
  • With Wine 自分自身のディストリビューションパッケージマネージャによってインストールされているか、ソースからコンパイルされたものです.
  • 私が前に述べたように、それらのすべては、ちょうど完全に(1つの方法または別の)動作します.しかし、好奇心はいまだにしがみつきました:「私はちょうどすべてのものがインストールされる容器を持っていることができます、そして、すべてのそれらの依存関係が私のシステムにぶら下がっていることができませんか?」
    実際には、その質問はいつも私に戻ってきたとき、私は私のシステムにインストールされているどのように多くのものについて考えると、私は本当に日常的に必要な数.さらに、私が変更するとき、または私のディストリビューションを再インストールする必要が何を欠場します.
    それを念頭に置いて、コンテナを使って実験を始めました.残念ながら、壊れてしまった新しいバージョンにアップグレードして、以前の作業用のバージョンのパッケージを再インストールしなければならなかったので、新しいバージョンのワインを多少きれいな方法でテストするだけであっても.
    それで、私はUbuntuの焦点容器からものを造って、2つの容器に分けられることに決めました:
  • NVIDIAドライバがインストールされているUbuntuベースのベースコンテナ
  • 私の実際のワインのコンテナゲームのすべての依存関係.
  • 私はGPUのドライバーが頻繁に出てこないので(残念ながら)このアプローチに行きました.また、私は仕事をするベースイメージを持つこともできます.
    詳細については、DockerFileに異常がある場合は、このビルドシステムが準備されているので注意してください.しかし、彼らはまた、通常伝統的に構築することができますdocker build CMDデフォルトは-- build - arg flagsで上書きできます.
    また、あなたのホストにインストールされているドライバのバージョンは、コンテナー内にインストールされているドライバと同じです.

    ベースコンテナ


    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
    
    
    したがって、これはUbuntuの焦点バージョンとNVIDIAドライバ450(デフォルトで)に基づいて最初のコンテナです.私は次のステップのためにそれを参照します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 and cabextract 私はそれらをワインと一緒に置くことにした.また、いくつかのフォントパッケージは、ランチャー/ローダによって多く使用されて以来.
    私は、それらの必要なパッケージのためにちょうどもう一つのステージを持つことができたと思います、しかし、私は彼らを置く最高のステージを見つけ出すために、まだ時間がありませんでした.
    それで今、我々は巨大なコマンドラインを記憶しなければならないのを避けるためにコンテナを使用するスクリプトを作成する必要があるだけです.
    この時点で、追加することもできますdxvk この行をDockerfileに追加することでコンテナに
    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はwineトリックでインストールすることもできます.それで、私はちょうどWineTrip方法で今行きます.
    このスクリプトをパスディレクトリの1つに追加できますので、いつでもコンテナを起動できます.
    また、それは私のコンテナ上の環境変数としてすべてのバージョンを持っているだけで個人的な好みですので、私はすぐに私が必要とする任意の時間を確認することができます.
    $ HOME/TMPパスに一時的なフォルダを作成し、コンテナ内の$ HOMEとして使用します.また、WinePrefixである現在のパスは、$ホーム/ゲームの容器の中に置かれます.
    私はこのようにそれをしなければならなかった.xauthorityファイルはホームディレクトリにマウントされます.
    1 -私がWinePrefix私のホームdirを作ったならば、...Xauthorityファイルはホスト上の位置にコピーされる.
    2 -ホームディレクトリが存在しない場合は、ユーザーによって作成されますroot (コンテナのデフォルトユーザで、ホームディレクトリを使用して、特定のファイルを書き込むためのデフォルトの場所としてホームディレクトリを使用するいくつかのアプリケーションのパーミッションが不足します.
    #!/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)
  • それは/ワイン/ゲームにwineprefix envを設定します-e WINEPREFIX=/wine/game そして、私の家を/ワインに設定してください-e HOME=/wine
  • コンテナ内のX 11ソケットを含むディレクトリをマウントします-v /tmp/.X11-unix:/tmp/.X11-unix
  • PulesAudioを使っているので、ソケットパスを定義します-e PULSE_SERVER=unix:/pulse そして、それはコンテナの中に私の実際のソケットを置きます-v /run/user/$(id -u)/pulse/native:/pulse
  • それは私のマウントされます.ユーザのホームディレクトリにあるXauthorityファイル-v $HOME/.Xauthority:/wine/.Xauthority
  • NVIDIA GPUに対応するすべてのデバイスを追加する
  • そして最後にコンテナのホームとゲームのパスをマウント
  • また、コンテナに余分なワイン変数を渡すためにこのスクリプトを拡張することもできます.
    今、我々は直接に行くことができるコンテナの中に/wine/game そして、起動したり、実行したいものを再生を開始します.
    余分なパッケージをインストールする必要がある何かをインストールしようとすると、新しいシェルを開く可能性もあり、コンテナをrootとして入力し、実行するだけで必要なものをインストールしますdocker exec -u root -ti wine bash .
    ワインを使うことは本当にこのポストの目標ではありません、しかし、それを助けるためにインターネットのまわりに十分な情報があります.そして、wineトリックをインストールしても、接頭辞を構成する良い援助です.
    私が持っていた動機の1つは、そのディレクトリ構造(および$ vhomeパス)を使用してもwineトリックダウンロードのためのいくつかのキャッシュを維持しようとすることでした.
    私はこの方法を戦いを開始しようとしました.ネットと驚くほどよく働いたゲームのカップルをお試しください.
    私は壮大なゲーム店を走らせることができました、しかし、残念なことに、私がそこに持っている2、3のゲームをしようとするとき、運がありませんでした.私は、何かが接頭辞で行方不明だったと思います.
    そして最後に、ウォーゲームのゲームセンターをインストールし、タンクの世界のいくつかのラウンドを再生することができた.
    この時点で、必要な作業のほとんどは、接頭辞で必要な依存関係を理解しています.Lutrisインストールスクリプトは、与えられたゲームに関する詳細な情報を探すのに良いです.
    いくつかのエラーが発生しますが、ワインのデバッグメッセージはまた、いくつかの問題をトレースし、インストールする必要があります可能な不足パッケージを見つけるのに役立つことができます.

    セキュリティ問題


    私はこのアプローチのセキュリティ欠陥に深く飛び込むつもりはない.
    アリKalfusは、すでに彼のポストで非常によくそれをしました.任意の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
    
    我々が加えるとき、働くのを止めるもののうちの1つを心に留めてください--cap-drop=all コンテナに入る可能性はroot そして、コンテナシステム上で何かを変更します.
    もちろんLinuxでゲームをするのは簡単ですが、この作業をすることは私にとって良いことです.
    私はこの仕事をAMDまたはインテルGraphicsで得るようにしようとしてこのポストを改善することができました、しかし、それは私が現在することができない何かです.