発生したこと
su コマンドは -
オプション(-l
, --login
も同義)の有無で以下のように挙動が変わります。
su
: インタラクティブシェル(ノンログインシェル)で起動su -
: ログインシェルで起動
しかし、Apple Silicon を搭載した Mac で、amd64 イメージのコンテナを Rosetta でエミュレートして実行した場合に、 su -
の挙動が想定とは異なりインタラクティブシェルで実行されてしまうというバグが存在しています。
環境
- Docker Desktop for Mac: v2.23.0
- チップ: Apple M2
- OS: MacOS Sonoma
検証
# --platform linux/amd64 を指定して、amd64 イメージを取得
❯ docker image pull --platform linux/amd64 debian:stretch
❯ docker run -it --rm 662c05203bab bash
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
$ su root -c shopt | grep login_shell
login_shell off
$ su - root -c shopt | grep login_shell
login_shell off # <= 本来はログインシェルのはずだが、インタラクティブシェルになっている。
解決方法
こちら Docker Desktop for Mac の issue にある通り、Docker Desktop のバージョン 2.23.0 以下だと発生するバグのようで、アップデートにより解消できます。
Rosetta emulation changes shell behaviour · Issue #7009 · docker/for-mac
Description Enabling Rosetta emulation causes standard ways of obtaining a login shell (as opposed to a non-login shell) on Linux containers to fail. su - (as o...
筆者の環境でも Docker Desktop のバージョンを 2.26.1 にしたところ、su -
の挙動が期待通りになっていることが確認できました。
❯ docker run -it --rm 662c05203bab bash
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
$ su root -c shopt | grep login_shell
login_shell off
$ su - root -c shopt | grep login_shell
login_shell on # <= ログインシェルとして起動されている
Web 上でもこの問題を取り上げているのはこの issue くらいでほとんど情報がなく、私は解決までにかなり時間がかかってしまいました…本記事が皆様のお役に立てますと幸いです!
コメント