デフォルトユーザがrootでないコンテナで、sudoコマンドも無い場合にコンテナ内でrootユーザになる方法。

docker composeの-uオプション

docker compose execコマンドに-uオプションをつけるとrootユーザーでコンテナにログインできる。

$ docker compose exec -u root サービス名 sh

実験

実験で使うコンテナイメージ

prom/prometheusnobodyユーザーで実行されており、 sudoコマンドも無い。

このイメージを使って実験する。

version: '2'

services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"

起動とログイン

上記docker-compose.ymlを作成し、docker-composeで起動する。

$ docker compose up -d
...
 ✔ Network docker-nginx_default
 ✔ Container docker-nginx-prometheus-1  Started

まずはdocker compose execコマンドでユーザを指定せずにログインしてみる。
ログインユーザはnobodyとなっている。

$ docker compose exec prometheus sh
/prometheus $ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)

sudoコマンドも無い。

/prometheus $ sudo su -
sh: sudo: not found

suコマンドによるrootユーザーへの切り替えも許可されていない。

/prometheus $ su
su: must be suid to work properly

rootユーザーでログイン

-uオプションをつけてrootユーザーでログインする。

$ docker compose exec -u root prometheus sh
/prometheus # id
uid=0(root) gid=0(root) groups=0(root),10(wheel)

sh以外のコマンドもrootで実行できる

sh以外のコマンドも-uオプションをつけてrootユーザーで実行できる。
例えば/rootディレクトリはrootユーザーのホームディレクトリなので、root以外ではアクセスできない。
以下のように-u rootオプションをつけた上で実行すると閲覧が可能となる。

$ docker compose exec -u root prometheus ls -a /root
.             ..            .ash_history