🦴

Jupyter公式イメージのユーザー切り替え機能だけ抜き出してみた

2024/06/15に公開

Jupyter公式イメージのユーザー切り替え機能が便利

以下の記事でも紹介した Jupyter 公式のノートブックイメージにはユーザーの切り替え機能がついており、環境変数にユーザーの情報を指定するだけでユーザーを作成してくれるので、これが地味に便利です。

https://zenn.dev/wsuzume/articles/fe8c186a03b4e4

これがあるだけで複数のユーザーで使用するイメージに関しては docker container run するときにやらねばならないユーザー権限調整周りのハックのレベルが数段下がります。

というわけで、このユーザー切り替え機能の部分だけを抜き出したリポジトリを作りました。既存の Debian 系ベースイメージに最初に被せておくか、Debian 系イメージをベースに自分で作成したイメージの上から最後に被せることで、切り替え機能を使えるようになります。

https://github.com/wsuzume/debian-stacks-foundation

以下、READMEを日本語訳して置いておきます。 Enjoy your Hacking Life!

debian-stacks-foundation

Docker上のDebianベースのイメージ用の開発環境レイヤー。

これは、Jupyterの公式イメージ(例:minimal-notebook)に組み込まれているユーザー切り替え機能を抽出します。このレイヤーをDockerイメージに組み込むことで、コンテナの起動時にユーザーIDとグループIDを簡単に調整できるようになります。これは、Dockerコンテナを開発環境として使用したい場合に非常に便利です。

使用方法

まず、bookwormやubuntu(例:ubuntu:22.04)など、お好きなDebianベースのベースイメージを選択します。カスタマイズしたイメージを使用することもできます。次に、この開発レイヤーを適用した後のイメージのタグを決定します(例:ubuntu-devel:22.04)。選択が終わったら、次のコマンドを実行します。

DOCKER_BUILD_ARGS="--build-arg ROOT_CONTAINER=ubuntu:22.04" TAG="ubuntu-devel:22.04" make build

Dockerコマンドを実行するためにsudoを使用する必要がある場合は、コマンドをmake sudo_buildに変更します。

上記の手順で作成した開発イメージを使用してコンテナを起動すると、デフォルトユーザーは uid=1000(morgan) gid=100(users) groups=100(users) になります。

$ sudo docker container run -it --rm ubuntu-devel:22.04
Entered start.sh with args:
Running hooks in: /usr/local/bin/start.d as uid: 1000 gid: 100
Done running hooks in: /usr/local/bin/start.d
Running hooks in: /usr/local/bin/init.d as uid: 1000 gid: 100
Done running hooks in: /usr/local/bin/init.d
Executing the command: bash
morgan@f03bad688337:~$ id
uid=1000(morgan) gid=100(users) groups=100(users)

コンテナ起動時にrootをユーザーとして指定する場合、USERUIDGIDなどの環境変数を指定することができます。

$ sudo docker container run -it --rm -u root -e USER=jovyan -e UID=1200 -e GID=2000 ubuntu-devel:22.04
Entered start.sh with args:
Running hooks in: /usr/local/bin/start.d as uid: 0 gid: 0
Done running hooks in: /usr/local/bin/start.d
Updated the morgan user:
- username: morgan       -> jovyan
- home dir: /home/morgan -> /home/jovyan
Update jovyan's UID:GID to 1200:2000
userdel: group jovyan not removed because it is not the primary group of user jovyan.
Attempting to copy /home/morgan to /home/jovyan...
Success!
Changing working directory to /home/jovyan/
Running hooks in: /usr/local/bin/init.d as uid: 0 gid: 0
Done running hooks in: /usr/local/bin/init.d
Running as jovyan: bash
jovyan@1702d80c380f:~$ id
uid=1200(jovyan) gid=2000(jovyan) groups=2000(jovyan),100(users)

さらに、-u rootと共に-e GRANT_SUDO=yesを指定することで、コンテナ内でsudoの使用を有効にできます。

$ sudo docker container run -it --rm -u root -e GRANT_SUDO=yes ubuntu-devel:22.04
Entered start.sh with args:
Running hooks in: /usr/local/bin/start.d as uid: 0 gid: 0
Done running hooks in: /usr/local/bin/start.d
Granting morgan passwordless sudo rights!
Running hooks in: /usr/local/bin/init.d as uid: 0 gid: 0
Done running hooks in: /usr/local/bin/init.d
Running as morgan: bash
morgan@5011d0d9149f:~$ sudo ls
work

Discussion