発端
phpのget_current_user()
でファイル所有者が取得できない。
スクリプトに下記のように書いても、
var_dump(get_current_user());
こうなる訳です。
string(0) ""
元々下記のようなコードがありwarning出力&所有者変更が行われなくなってしまいはまっていた。
chown($filename, get_current_user());
warningの内容。
forの後に不自然なスペースが、、
chown(): Unable to find uid for in
これ、仮に存在しないユーザーを所有者に変更しようとした場合にはここにユーザー名が入る。
chown(): Unable to find uid for test in
環境
・Vagrantfileで作成したVM上で、Dockerコンテナを利用
・ローカル(Mac)のディレクトリをコンテナと共有
ローカルで試してみた
Macのローカルでvar_dump(get_current_user());
してみると、ちゃんとファイル所有者が出力される。
それで気づいた。
コンテナ内ではスクリプトの所有者が501になってる、、
-rw-r--r-- 1 501 dialout 2869 Mar 2 08:18 TestShell.php
501はどこからやってくるのか
コンテナと共有しているファイルは、ローカルで所有者表示させるとここでは置き換えているけど、ちゃんと意図したものになっている。
-rw-r--r-- 1 <ユーザー名> <グループ名> 2869 3 2 17:18 ./app/src/Shell/QueingShell.php
これがコンテナに行った時には、違う所有者のものになっている。
当たり前といえば当たり前だけど、なんとなくrootとかが所有者になってると思ってた。
501は当然UIDだが、コンテナ(php-fpmのDockerHubイメージデフォルト)にはUID501のユーザーは存在していない。
/app # cat /etc/passwd
root:x:0:0:root:/root:/bin/ash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
man:x:13:15:man:/usr/man:/sbin/nologin
postmaster:x:14:12:postmaster:/var/mail:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
at:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin
squid:x:31:31:Squid:/var/cache/squid:/sbin/nologin
xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
cyrus:x:85:12::/usr/cyrus:/sbin/nologin
vpopmail:x:89:89::/var/vpopmail:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
smmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
www-data:x:82:82:Linux User,,,:/home/www-data:/sbin/nologin
###Linuxにおける501ユーザーとは
UID501とは何を指すのか。
作成するユーザーのUIDは501から順にふられて行く、くらいしか知らなかったけど、下記のurlがとても参考になった。
https://oshiete.goo.ne.jp/qa/8209736.html
問題の解決
ローカルのボリュームがマウントされたコンテナでは、ボリューム内のファイルの所有者が501になるのが仕様っぽい。(掘り下げたい)
ただしコンテナ側ではuid501のユーザーは存在していない為get_current_user()
すると空文字になってしまう。
空文字を回避したいだけなら、コンテナのuid501をちゃんとユーザーとして追加してあげれば良い。
alpineLinuxの場合
adduser -u 501 test -D
オプションの-D
はデフォルト値を変更する意。
名前はなんでも良いので今回はtest。
これでget_current_user()
した時にtestが取得されるようになった。