概要
この記事では、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
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
他によりかんたんな方法があれば、ぜひ教えてください!
コメント