skydum

個人的な作業記録とか備忘録代わりのメモ

Docker outside of Dockerの/var/run/docker.sockの権限

Docker outside of Docker(DooD)

普段dockerを使う時はホスト側からコマンドでコンテナを起動して、終わったらコンテナを削除するという使い方をしている。
けれども、開発したアプリケーションをdockerコンテナで動作させて、そのコンテナから別のコンテナを起動する必要があったので、Docker outside of Docker(Dood)を利用した。
その時にdockerコンテナをrootで起動するとホスト側にファイルを書いたりするとroot権限でファイルが書き込まれて面倒なので、コンテナをroot以外のユーザーで起動するようにした。
そうするとDooDで利用する/var/run/docker.sockの書き込み権限がなくてコンテナが起動できずに少し焦ったので、備忘録として記録しておく。

ホストにファイルを書いたときのファイルの所有者

最初に以下のようなコマンドでコンテナを起動して、コンテナ内からホスト側にファイルを書き込むと当然root:rootでファイルが書かれる。
ログなら困らないかもしれないがデータファイルなどの場合、rootでファイルが出来ると面倒なので、コンテナをユーザー、グループを指定して起動する。

  • ユーザー、グループ指定なし(ホストに書かれるファイルはrootが所有者)
docker run -it --rm \
  --mount type=bind,source=/var/log/app,target=/var/log/app \
 app-container
  • ユーザー、グループ指定あり(ホストに書かれるファイルはapp-userが所有者)
docker run -it --rm \
  --user app-user:app-user \
  --mount type=bind,source=/var/log/app,target=/var/log/app \
 app-container

DooDでコンテナを起動する

DooDでdockerを起動してコンテナ内からホスト側のdockerコマンドを利用する場合、/var/run/docker.sockに対する書き込み権限がコンテナ内のユーザーに必要となる。
単にdocker -userでユーザー、グループを指定して起動するとコンテナ内からホスト側のdockerコマンドが利用できなくなる。

  • ユーザー、グループ指定なし(ホストに書かれるファイルはrootが所有者)
  • コンテナ内からホスト側のdockerコマンドが利用できる
docker run -it --rm \
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
  app-container
  • ユーザー、グループ指定あり(ホストに書かれるファイルはapp-userが所有者)
  • コンテナ内からホスト側のdockerコマンドが利用できない(/var/run/docker.sockの書き込み権限がない)
docker run -it --rm \
  --user app-user:app-user \
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
  app-container

DooDでユーザー名とグループ名を指定してもコンテナ内からホストのdockerコマンドを利用できるようにする

方法はいくつかある。 1. chmod 666 /var/run/docker.sock で全てのユーザーに対して書き込み権限を与える。 1. chwon app-user:docker /var/run/docker.sock でコンテナを起動するユーザーに対して書き込み権限を与える。 1. コンテナ起動時に app-userのuser id, dockerのgroup idを指定して起動する。
今の所これが一番良さそう。

docker run -it --rm \
  --user $(id -u):$(getent group docker | cut -d: -f3) \
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
  docker:latest

DooDのテスト

  • 権限がなくて失敗する
docker run -it --rm \
  --user $(id -u):$(id -g) \
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
  docker:latest docker run hello-world
  • 書き込み権限があるので成功する
docker run -it --rm \
  --user $(id -u):$(getent group docker | cut -d: -f3)\
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
  docker:latest docker run hello-world