Docker環境内でUnityを動かす方法を紹介します。

UnityのDocker環境を構築する

Unityを触りたくなったので、そのための環境を構築していきます。ローカルにいろいろインストールして汚したくないので、Docker環境内で完結するようにしていきます。

手順

1:Unity IDの作成

Unityホームページでアカウントを作成します。もちろん無料で作成できます。

2:Dockerのインストール

PCにGPUが搭載されている場合は、Dockerコンテナ内でもGPUを使えるようにするため、以下3つをインストールします。GPUを使用しない場合は、DockerのみでOKです。

  • Docker
  • Nvidia Driver
  • Nvidia Container Runtime

インストール方法の詳細は、以下の記事にまとめています。

【Ubuntu】DockerでGPUを使うまでの環境構築

3:Dockerfileの実装

########## Pull ##########
FROM nvidia/opengl:base-ubuntu20.04
########## User ##########
ARG home_dir="/home/user"
COPY copy/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN apt-get update && \
	apt-get install -y \
		gosu \
		sudo && \
	chmod +x /usr/local/bin/entrypoint.sh && \
	mkdir -p $home_dir
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
########## Non-interactive ##########
ENV DEBIAN_FRONTEND=noninteractive
########## Unity ##########
## Hub
RUN apt-get update && \
	apt-get install -y \
		wget \
		gnupg gnupg2 && \
	wget -qO - https://hub.unity3d.com/linux/keys/public | gpg --dearmor | tee /usr/share/keyrings/Unity_Technologies_ApS.gpg > /dev/null && \
	sh -c 'echo "deb [signed-by=/usr/share/keyrings/Unity_Technologies_ApS.gpg] https://hub.unity3d.com/linux/repos/deb stable main" > /etc/apt/sources.list.d/unityhub.list' && \
	apt-get update && \
	apt-get install -y \
		unityhub \
		libgbm-dev \
		firefox
## Editor
ARG editor_version=2022.3.8f1
RUN apt-get update && \
	apt-get install -y xvfb && \
	sed -i 's/^\(.*DISPLAY=:.*XAUTHORITY=.*\)\( "\$@" \)2>&1$/\1\2/' /usr/bin/xvfb-run && \
	echo '#!/bin/bash\nxvfb-run -a /opt/unityhub/unityhub-bin --no-sandbox --headless "$@" 2>/dev/null' > /usr/bin/unityhub-root && \
	chmod +x /usr/bin/unityhub-root && \
	mkdir -p $home_dir/Unity/Hub/Editor && \
	unityhub-root install-path --set "$home_dir/Unity/Hub/Editor" && \
	unityhub-root install --version $editor_version
## Requirements RUN apt-get update && \ apt-get install -y \ libglu1 \ libgconf-2-4 ########## Initial Position ########## WORKDIR $home_dir CMD ["bash"]

./copy/entrypoint.shは以下のとおりです。

#!/bin/bash

user_name=user
user_pw=$user_name
user_id=${local_uid:-9001}
group_id=${local_gid:-9001}

useradd -u $user_id -o -m -G sudo $user_name
groupmod -g $group_id $user_name
echo $user_name:$user_pw | chpasswd
echo "$user_name ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

chown -R $user_name /home/$user_name

exec /usr/sbin/gosu $user_name "$@"

補足

  • FROM nvidia/opengl:base-ubuntu20.04
    GPUを使って描画したいため、OpenGLのイメージをベースにしています。
  • RUN apt-get update && \
    	apt-get install -y xvfb && \
    	sed -i 's/^\(.*DISPLAY=:.*XAUTHORITY=.*\)\( "\$@" \)2>&1$/\1\2/' /usr/bin/xvfb-run && \
    	echo '#!/bin/bash\nxvfb-run -a /opt/unityhub/unityhub-bin --no-sandbox --headless "$@" 2>/dev/null' > /usr/bin/unityhub-root && \
    	chmod +x /usr/bin/unityhub-root && \
    	mkdir -p $home_dir/Unity/Hub/Editor && \
    	unityhub-root install-path --set "$home_dir/Unity/Hub/Editor" && \
    	unityhub-root install --version $editor_version
    「なぜこんな複雑な記述をしているのだ?」と思われた方々は以下を辿ってみてください。ちなみに、この記述はunityci/hubのDockerfileを参考にしています。
    • 試しに以下のようにシンプルに書いてみると、、、
      RUN mkdir -p $home_dir/Unity/Hub/Editor && \
      	unityhub install-path --set "$home_dir/Unity/Hub/Editor" && \
      	unityhub install --version $editor_version
      「--no-sandboxをつけろ」となってビルドできません。
      [0826/021245.865512:FATAL:electron_main_delegate.cc(293)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.
      Trace/breakpoint trap (core dumped)
    • 言われたとおり--no-sandboxをつけてみると、、、
      RUN mkdir -p $home_dir/Unity/Hub/Editor && \
      	unityhub install-path --set "$home_dir/Unity/Hub/Editor" --no-sandbox && \
      	unityhub install --version $editor_version --no-sandbox
      次は「ディスプレイがない」と怒られます。
      [8:0826/022604.670759:ERROR:ozone_platform_x11.cc(239)] Missing X server or $DISPLAY
      [8:0826/022604.670794:ERROR:env.cc(255)] The platform failed to initialize.  Exiting.
      The futex facility returned an unexpected error code.
      Aborted (core dumped)

4:Dockerイメージのビルド

docker build . -t unity_editor:2022_3_7f1

5:Dockerコンテナの起動

xhost +

docker run \
	-it \
	--rm \
	-e local_uid=$(id -u $USER) \
	-e local_gid=$(id -g $USER) \
	-e "DISPLAY" \
	-v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \
	--privileged \
	--gpus all \
	unity_editor:2022_3_7f1

GPUを使用しない場合は「--gpus all」の行を削除してください。

6:Unityの起動

起動したDockerコンテナ内で、以下のコマンドを実行するとUnity Hubが起動します。

unityhub
Screenshot from 2023-08-26 10-56-00

Unity Hubの「Sign in」をクリックすると、Firefoxがポップアップして、サインインが求められます。手順1で作成したアカウントのとおり入力すると、Unity Hubへ戻ります。

Screenshot from 2023-08-26 10-56-54 Untitled 1

あとは自由にプロジェクトを作成したりしてみてください。

Screenshot from 2023-08-26 11-05-53

補足

Unity Hubにサインインする前に、以下のコマンドでEditorを起動しようとすると、「No valid Unity Editor license found. Please activate your license.」とエラーになってしまいます。

~/Unity/Hub/Editor/2022.3.7f1/Editor/Unity
Screenshot from 2023-08-26 10-49-36

さいごに

環境構築、お疲れさまでした。参考になれば幸いです。

Ad.