みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

rootless Dockerを別のマシンのDocker CLIから使えるようにする

以下では,rootless Dockerをインストールしたリモートサーバーの,ユーザー名はmt,ホスト名はmt-server.localとします.

DockerコマンドのPATHの追加

% docker version
error during connect: Get "http://docker.example.com/v1.24/version": command [ssh -l mt -- mt-server.local docker system dial-stdio] has exited with exit status 127, please make sure the URL is valid, and Docker 18.09 or later is installed on the remote host: stderr=bash: docker: command not found

"bash: docker: command not found" と表示されているので,dockerコマンドが見つからないようです.試しに,

% ssh -l mt -- mt-server.local docker  

と実行すると同じエラーが表示されました.rootless Dockerの場所を環境変数PATHに追加します.以下のコマンドで環境変数が変更されたことを確認します.

% ssh -l mt -- mt-server.local env  

パスを追加したい〜.bashrc編〜 - ITmedia エンタープライズ

環境変数$DOCKER_HOSTの設定

% ssh -l mt -- mt-server.local docker system dial-stdio
failed to open the raw stream connection: dial unix /var/run/docker.sock: connect: no such file or directory

どうやらrootless Dockerでは,環境変数$DOCKER_HOSTが設定されていないと上記のエラーが出るみたいです.

Run the Docker daemon as a non-root user (Rootless mode) | Docker Documentation

非ログインシェルで .bashrcの環境変数が読み込まれない

色々なサイトで紹介されていますが,デフォルトの.bashrcには以下の行が存在するので,この行より上に記載しなければなりません.

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

bash - Why does bashrc check whether the current shell is interactive? - Unix & Linux Stack Exchange

bashの初期化ファイルには .profile .bashrc, .bash_profileなどがあり,状況によって読み込まれるファイルが異なるので注意が必要です.以下のサイトが詳しいです.

bash の初期化ファイル .profile, .bashrc, .bash_profile の使い分けと管理方針 - A Memorandum

結論

リモートサーバーのrootless Dockerを実行するユーザーの~/.bashrcを以下のような内容にします.

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

export DOCKER_HOST=unix:///run/user/1000/docker.sock
PATH="$PATH":/home/mt/bin