まとめ
- composer.json を修正する。
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
を修正する。例えば、"@php -r \"file_exists('.env.laravel') || copy('.env.laravel.example', '.env.laravel');\""
とする。@php artisan package:discover --ansi
を修正する。例えば、@php artisan package:discover --ansi --env=laravel
とする。- 同様に
@php artisan key:generate --ansi
を修正する。例えば、@php artisan key:generate --ansi --env=laravel
とする。
- サーバレベル、システムレベルやコンテナレベルで定義されている外部の環境変数によって使用する .env ファイル名を制御する。例えば、
APP_ENV=laravel
とする。- 【 export 】コマンド――環境変数やシェル変数を設定する:Linux基本コマンドTips(174) – @IT
- Dockerfile では
ENV APP_ENV laravel
などと書く。
具体的な使い途
decker-compose.yml
に読み込ませる .env
ファイルと、 Laravel に読み込ませる .env
ファイルを同じディレクトリにおきたいときに問題が発生します。このとき Laravel に読み込ませるファイル名を変更することで問題を回避できます。
なお、ドキュメントをあさってみましたけれども、 Docker Compose に読み込ませる環境設定ファイルは、 .env
以外は不可能なようでした。ですので、 Laravel に読み込ませるファイル名の方を変更します。
具体的なコード
次のように修正することで実現できました。
Laravel をコンテナ化して動作させておりますので、 Dockerfile にコンテナの環境変数として ENV APP_ENV laravel
の定義を追加しております。
もし、コンテナではない環境の場合では、 export APP_ENV=laravel
といったコマンドを実行すれば良いかと存じます。
$ git diff --cached
diff --git a/.env.example b/.env.laravel.example
similarity index 100%
rename from .env.example
rename to .env.laravel.example
diff --git a/.gitignore b/.gitignore
index 34ec6d5..3c86da5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,8 +6,8 @@
/public/storage
/storage/*.key
/vendor
-.env
.env.backup
+.env.laravel
.phpunit.result.cache
Homestead.json
Homestead.yaml
diff --git a/Dockerfile b/Dockerfile
index 6f54432..67cfe5c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -19,6 +19,7 @@ COPY ./docker/000-default.conf /etc/apache2/sites-available/000-default.conf
ENV APACHE_DOCUMENT_ROOT /var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
+ENV APP_ENV laravel
FROM composer:1.9.3 AS composer
diff --git a/composer.json b/composer.json
index 4d19d86..ae00022 100644
--- a/composer.json
+++ b/composer.json
@@ -50,13 +50,13 @@
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
- "@php artisan package:discover --ansi"
+ "@php artisan package:discover --ansi --env=laravel"
],
"post-root-package-install": [
- "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+ "@php -r \"file_exists('.env.laravel') || copy('.env.laravel.example', '.env.laravel');\""
],
"post-create-project-cmd": [
- "@php artisan key:generate --ansi"
+ "@php artisan key:generate --ansi --env=laravel"
]
}
}
$
@php artisan package:discover --ansi --env=laravel
について
.env
から .env.laravel
へとファイル名を変更しました。
Docker ビルド時、 Laravel インストール後に @php artisan package:discover --ansi
を実行いたします。このとき、このままではエラーとなってしまいました。
原因は、 Laravel インストールは運用するときのコンテナではなく、 Composer コンテナで行い、このコンテナには環境変数に APP_ENV=laravel
が設定されていないからなのでした。
これを解消するには、
- Composer コンテナに環境変数
APP_ENV=laravel
を設定する。 - Laravel インストール後のコマンド実行時のオプションに
--env=laravel
を追加する。
の 2 つのやり方が思いつきます。
今回はオプションで対応しました。(今ふと思うと、 Composer コンテナに環境変数を設定するほうが筋が良いかもしれない)
オプションで指定するとき、混乱しました。
--env=.env.laravel
と素直にファイル名を指定してはダメで、 --env=laravel
と、 .env.laravel
の先頭の .env.
を除いた部分を指定する必要がありました。
読み込む環境設定ファイルを決定しているロジックのコードを見る
- 読み込むファイル名を
.env
と決めている場所 - 読み込む環境設定ファイル名を決定している関数。
--env=xxx
と指定されていれば、.env.xxx
ファイルを読み込む、APP_ENV=yyy
と指定されていれば、.env.yyy
ファイルを読み込む、というロジックになっています。
参考ページ
おわりに
Laravel を Docker 化することを以前行いまいした。データーベースもコンテナを利用したい、そうすると Docker Compose を使いたい、そうすると、パスワード等の情報は Docker Compose の .env
ファイルに書きたい。
しかし、そうすると Laravel の .env
ファイルと被ってしまい両立できません。
調べたところ Docker Compose の .env
ファイルはファイル名を変更できないようでした。一方で、 Laravel での .env
ファイル名の方は変更可能でしたので、今回の投稿となりました。
以上です。
「Laracel 6 で、 `.env` ファイルの名前を変えて運用する方法」への1件の返信
[…] 前回 、 "Composer コンテナに環境変数を設定するほうが筋が良いかもしれない" とコメントしたが、実際にできたのでメモ […]