目的
・passとか機密情報を.envファイルから読み込めるようにしたい。
環境
・Macbook air M1 2020 / sonoha 14.2.1
・Docker
・php:8
phpdotenvはcomposerでインストールするので
まずdocker hub公式からcomposerが使えるようにすべく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();
を追記。
<?php
require './vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
var_dump($_ENV['DB_PASSWORD']);
すると
>
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でインストールした状態を自らの開発環境に合うよう、適宜ディレクトリの移動を意識せねば。