DockerとかVagrantでnginx等を使う時はまずLinuxの知識をだな......(戒め)
#1. 背景
フロント学んできて、そろそろバックエンドもまなんでみようと思い、せっかくなので流行りのDokcerを使用しPHPでサーバーに画像をアップロードするコードを書いた。
そしてハマった
#2. 環境
・windows10<VirtualBox(vagrant)<CentOS7<Docker
起動構成
version: '3'
services:
web:
#ver 1.17.7
build: ./nginx
ports:
- '8080:80'
links:
- php-fpm
volumes:
- ./data/public:/var/www/html/public
depends_on:
- php-fpm
php-fpm:
#ver 7.3
build: ./php-fpm
links:
- db
volumes:
- ./data:/var/www/html
#3. ハマったところ
このPHPの一行からなるエラーで無限に悩んだ
move_uploaded_file($_FILES['image']['tmp_name'], $savePath);
Permisson denied ......
##4.1 まずやったこと
とりあえず浅いLinuxの知識を用いて画像保存フォルダの権限を
$sudo chmod 777 images
としてコードが動くのを確認。
もちろんこんなセキュリティガバガバな権限は例えローカルサーバーでも許せなかったので却下
##4.2 解決策
phpinfoでユーザーを確認してみる。
www-dataがUSERだと判明。
じゃあwww-dataに権限付与してあげればよさそう
vagrant環境下の権限はこう
$ls -l
~
drwxrwxr-x. 2 vagrant vagrant 4096 Jan 13 08:32 images
~
$ sudo chown www-data images
chown: invalid user: ‘www-data’
有効ではないと告げられたのでユーザー一覧を確認してみます
$cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
~
vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
これ以外にも色々出てきたけどwww-dataユーザーなんて存在しない。
####どうすればいいのか
コンテナを立ち上げて
docker exec -it [id] bash
でphp-fpmコンテナに入ってみる。
その中のファイル権限は
drwxrwxr-x. 2 1000 1000 4096 Jan 13 08:32 images
1000 1000?
調べてみたらvagrantユーザーのuidが1000らしい。
これも$cat /etc/passwd
でユーザー一覧を確認すると
vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash
vagrntのuidに1000番が付けられてるのが分かる
VMという仮想環境の中にさらに仮想コンテナがあってそのコンテナ内では1000番uidに名前がついていないという事らしい
つまりコンテナ内では1000番にvagrntユーザーも含めユーザーは存在してないという事
でもuidは共通みたいだ
ならばコンテナ内から確認すればwww-dataがいるはず......
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
いた
####結局どうすればいいのか
正解なのかは分からないけど思いついたのはコンテナ外で33番UIDでグループがvagrantのユーザーを作ってimagesフォルダの持ち主を33番に変える。
これが自分の中でしっくりきました。
というかこれ以外成功してない
$useradd -u 33 www-data -g vagrant
$chown www-data images
他にも
https://gtrt7.com/blog/nginx/docker_userid_share#3docker-composeyml
のようにしてvagrant側からではなくdocker側から合わせればいけるらしい。
自分はこんなエラー出てわからんくて投げてしまいましたが
web_1 | 2020/01/13 13:52:54 [emerg] 1#1: host not found in upstream "php-fpm" in /etc/nginx/conf.d/default.conf:20
web_1 | nginx: [emerg] host not found in upstream "php-fpm" in /etc/nginx/conf.d/default.conf:20
default.conf:20fastcgi_pass php-fpm:9000;
##正直分からん
Dockerコンテナ内でファイル関係は完結させた方がいいんだろうなと感じてはいるもののいいやり方が浮かばず今回は断念。
ちょっと深堀するにはLinuxやnginx php-fpm等の知識が足りないので今はphpでファイルアップロードしたフォルダを作るさいは適宜権限変更するこのやり方のまま進んで、強くなったら戻ってこようと思いました。
いいやりかたあったら教えてほしい......