Help us understand the problem. What is going on with this article?

Dockerでnginx等を使う時はまずLinuxの知識をだな......(戒め)

DockerとかVagrantでnginx等を使う時はまずLinuxの知識をだな......(戒め)

1. 背景

フロント学んできて、そろそろバックエンドもまなんでみようと思い、せっかくなので流行りのDokcerを使用しPHPでサーバーに画像をアップロードするコードを書いた。
そしてハマった

2. 環境

・windows10<VirtualBox(vagrant)<CentOS7<Docker

起動構成

docker-compose.yml
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の一行からなるエラーで無限に悩んだ

upload.php
move_uploaded_file($_FILES['image']['tmp_name'], $savePath);

SnapCrab_NoName_2020-1-13_17-51-41_No-00.jpg

Permisson denied ......

4.1 まずやったこと

とりあえず浅いLinuxの知識を用いて画像保存フォルダの権限を
$sudo chmod 777 images
としてコードが動くのを確認。
もちろんこんなセキュリティガバガバな権限は例えローカルサーバーでも許せなかったので却下

4.2 解決策

phpinfoでユーザーを確認してみる。
SnapCrab_NoName_2020-1-13_18-30-53_No-00.jpg

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でファイルアップロードしたフォルダを作るさいは適宜権限変更するこのやり方のまま進んで、強くなったら戻ってこようと思いました。

いいやりかたあったら教えてほしい......

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away