前提・実現したいこと
Dockerを使用してPHPを学習しています。公開したくないデータをfile_put_contents()でドキュメントルート外に置きたいです。
発生している問題・エラーメッセージ
Warning: file_put_contents(../../secret/secret.txt): failed to open stream: No such file or directory in /var/www/html/sample.php on line 24
sample.php
<!doctype html> <html lang="ja"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="css/style.css"> <title>PHP</title> </head> <body> <header> <h1 class="font-weight-normal">PHP</h1> </header> <main> <h2>Practice</h2> <pre> <?php $pass = '../../secret/secret.txt'; $text = '見せたくない個人情報'; $success = file_put_contents($pass, $text); if ($success) { print('成功'); } else { print('失敗'); } ?> </pre> </main> </body> </html>
ディレクトリ構造
docker-compose.yml
version: '3' services: nginx: image: nginx:latest ports: - 8080:80 volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf - ./www/html:/var/www/html depends_on: - php php: build: ./php volumes: - ./www/html:/var/www/html depends_on: - db db: image: mysql:5.7.22 ports: - 13306:3306 volumes: - ./mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret phpmyadmin: image: phpmyadmin/phpmyadmin:latest ports: - 8888:80 depends_on: - db
nginx.conf
server { listen 80; server_name _; root /var/www/html; index index.php index.html; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ .php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
試したこと
file_put_contents()のパスの指定をドキュメントルート上にするときちんと動作しましたが、それ以外のディレクトリでは動作しませんでした。
Warning に /var/www/html... とあるのでDockerコンテナとのマウントの方で至らないところがあるのではないかと思っているのですが具体的にどうすればよいかわかりません。
補足情報
Docker Version: 20.10.2
php:7.3-fpm
nginx:latest
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。