rocker使用時にxauthのファイルが存在しないためエラーになる問題の対処

ROS

概要

この記事では、ROS(Robot Operating System)の開発や実行環境で使用するDockerコンテナを、rocker ツールを使って簡単に起動・設定する際に発生する問題とその対処方法を説明します。特に、xauth ファイルが存在しないことでDockerコンテナが起動できない問題への対処方法について解説します。

rocker を使用する際、コンテナを終了後に削除しないようにする --nocleanup オプションや、GUIアプリケーションを有効にするための --x11 オプションを指定すると、/tmp/ 配下に xauth ファイルが作成され、コンテナにバインドされます。

しかし、/tmp/ ディレクトリに保存された xauth ファイルは、PCを再起動すると削除されます。その結果、再起動後に次のようなエラーが発生し、Dockerコンテナが起動できなくなります。

2024-09-24 22:55:16.907 [error] Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting “/tmp/.dockerb1tasrxo.xauth” to rootfs at “/tmp/.dockerb1tasrxo.xauth”: create mount destination for /tmp/.dockerb1tasrxo.xauth mount: cannot mkdir in /var/lib/docker/overlay2/65d01adcd1f2fceb292de3f9bcd157ac81c5983c38c009011510aefe7274d4c8/merged/tmp/.dockerb1tasrxo.xauth: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
Error: failed to start containers: 1c4af1943be96dec4fcbf071d6e1832cdffb8e91e09fa1c573117720aad15edc

この問題に関連するGitHubのIssueを以下に示します:

--nocleanup argument unable to run rviz2 after re-entering container · Issue #170 · osrf/rocker
Hi, I ran rocker --nocleanup --nvidia --x11 --privileged --network host --volume xxxxx -- osrf/ros:galactic-desktop and ...
Make the xauth file persistant (instead of /tmp/.dockercfa2413r.xauth) when `--nocleanup` is used · Issue #273 · osrf/rocker
Hi, This is a issue already mentioned at #170 but it's closed, I would like to reopen it. When I use rocker (for autowar...

対処

xauthファイルを一度削除して、もう一度作り直したあとにDockerコンテナを起動することで起動ができます。

例えば、/tmp/.dockerb1tasrxo.xauthがない場合は以下のようにコマンドを実行します。

sudo rm -R /tmp/.dockerb1tasrxo.xauth
touch /tmp/.dockerb1tasrxo.xauth

複数コンテナあるし、毎回PC起動するたびに面倒だという方は、以下の処理を.bashrcに書いて置くと、bashを開いたときになければ作るようになります。

XAUTH_FILESに作成してほしいxauthファイルを記載していく形です。

XAUTH_FILES=(
    "/tmp/.dockerb1tasrxo.xauth"
    "/tmp/.dockers3te0ngk.xauth"
    # 必要に応じて他のパスを追加
)

for XAUTH_FILE in "${XAUTH_FILES[@]}"; do
    if [ ! -f "$XAUTH_FILE" ]; then
        touch "$XAUTH_FILE"
    fi
done

他によりかんたんな方法があれば、ぜひ教えてください!

コメント