0
0

More than 1 year has passed since last update.

【Docker】ファイルの所有者501はどこからやってくる?ディレクトリマウント時の困りごと

Last updated at Posted at 2021-03-18

発端

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が取得されるようになった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0