LoginSignup
0
0

【docker】phpdotenvで.envが読み込めないのでディレクトリを変えた

Last updated at Posted at 2024-04-16

目的
・passとか機密情報を.envファイルから読み込めるようにしたい。

環境
・Macbook air M1 2020 / sonoha 14.2.1
・Docker
・php:8

phpdotenvはcomposerでインストールするので
まずdocker hub公式からcomposerが使えるようにすべくDockerfileに下記を追記。

Dockerfile.
COPY --from=composer /usr/bin/composer /usr/bin/composer

vlucas/phpdotenvをインストールするべく

$ composer require vlucas/phpdotenv

まずはphpdotenvが機能して.envの読み込みを確認する。
phpdotenvが機能して.envを読み込めるように

require DIR . '/../vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(DIR . '/..');
$dotenv->load();

を追記。

index.php
<?php

require './vendor/autoload.php';

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

var_dump($_ENV['DB_PASSWORD']);

すると

$docker-compose exec app php index.php
>
Fatal error: Uncaught Dotenv\Exception\InvalidPathException: Unable to read any of the environment file(s) at [/var/www/html/data/../../.env]. in /var/www/html/vendor/vlucas/phpdotenv/src/Store/FileStore.php:68

.envファイルが読み込めないと。
階層を確認すると

docker
lib
src
	index.php
	phpvendor
.env
composer.lock
composer.yml
docker-compose.yml

となっている。
index.phpのrequireと$dotenvが示すpathを、1階層上に上がるようにいじるも結果変わらず。

ん?[/var/www/html/data/../../.env]ってなんだ?
rootディレクトリがきちんと機能していない気が。

まずはrootディレクトリを確認するべくbashへ入るために

$ docker-compose exec app /bin/bash

$ls -aしてみると

.  ..   index.php	vendor

.envが入ってない。
ってそりゃそうだ。
DockerfileではローカルデータをコンテナにCOPYする指定は ./src /var/www/html
なのでsrcディレクトリ以下のみ。

というわけで
.env
composer.lock
composer.yml
をsrcに移動させて再度ls -aで確認

.  ..  .env  composer.json  composer.lock index.php  vendor

コンテナのrootディレクトリにきちんと読み込まれた。
こちらも再度$ docker-compose exec app index.phpすると

string(4) "pass"

無事に.envを読み込めました。

エラーの真因は、ローカルからコンテナへCOPYされる仕組みの理解が不足していたこと。DockerfileでCOPYする場所を指定しているので、composerでインストールした状態を自らの開発環境に合うよう、適宜ディレクトリの移動を意識せねば。

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