今回やること
- DB 設定
- データベース URL で接続するデータベースを指定できるようにする。環境変数で指定できるようにする。
- データベース URL の指定がない場合は、コンテナ内の SQLite を使用するようにする。
- Laravel 6 を Docker 化する。その5 – oki2a24 の続きです。
Laravel コンテナの修正点
データベース URL で接続するデータベースを指定できるようにする。環境変数で指定できるようにする。
こちらの項目を実現するのは、実は何もしなくても大丈夫でした。その代わりに、 Laravel の知識が求められます。
Tip!! .envファイルにあるすべての変数は、サーバレベルやシステムレベルで定義されている、外部の環境変数によってオーバーライドすることができます。
これです。 Docker はコンテナ起動時にコンテナに対して環境変数を渡すことができます。
- 環境変数の設定(-e、–env、–env-file) run — Docker-docs-ja 17.06.Beta ドキュメント
- Set environment variables (-e, –env, –env-file) docker run | Docker Documentation
よって、例えば次のようにすればよく、 Laravel の方には一切変更は必要ありません。
docker container run -d --rm -p 80:80 --name sample_dockerized_laravel6 --env DATABASE_URL=mysql://root:password@mysqlhost/forge?charset=UTF-8 sample_dockerized_laravel6:latest
なお、データベース URL の指定の仕方について、次のページで少し整理しました。
データベース URL の指定がない場合は、コンテナ内の SQLite を使用するようにする。
こちらも簡単で、設定ファイルで接続するデータベースを sqlite にし、接続先としてコンテナ内の空ファイルを指定すれば良いだけです。
そこで、まず設定ファイルの元となる .env.example を次のように修正しました。
$ git diff .env.example
diff --git a/.env.example b/.env.example
index 604b401..d7f8f2f 100644
--- a/.env.example
+++ b/.env.example
@@ -6,12 +6,7 @@ APP_URL=http://localhost
LOG_CHANNEL=stack
-DB_CONNECTION=mysql
-DB_HOST=127.0.0.1
-DB_PORT=3306
-DB_DATABASE=laravel
-DB_USERNAME=root
-DB_PASSWORD=
+DB_CONNECTION=sqlite
BROADCAST_DRIVER=log
CACHE_DRIVER=file
そして、ビルド時の操作でデータベースとなるファイルを作成します。
$ git diff Dockerfile
diff --git a/Dockerfile b/Dockerfile
index ed64838..b14b03a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -30,3 +32,4 @@ RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-av
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
COPY --from=build --chown=www-data:www-data ./app/ .
+RUN touch ./database/database.sqlite
これで、 Laravel の Docker コンテナ起動時にデータベース接続の指定を特に行わなければ、コンテナ内部の database.sqlite が SQLite データベースとして使用されます。
他に行ったこと。
PostgreSQL をデータベースとして使用できるようにする
今までデータベースとして MySQL しか使ってきませんでした。たまたま PostgreSQL も使ってみようと思いましたけれども、そのための準備が整っていないことが明らかになりました。
その対処を行っています。
Docker Compose で動かすサンプルを追加する
次のシンプルな docker-compose.yml を書きました。 DATABASE_URL で、データベースを指定する例です。
version: '3.5'
services:
app:
build:
context: ./
dockerfile: ./Dockerfile
environment:
- DATABASE_URL=pgsql://laravel:secret@db:5432/laravel?charset=utf8&prefix_indexes=true&schema=public&sslmode=prefer
ports:
- "80:80"
db:
image: postgres:12
environment:
- POSTGRES_PASSWORD=secret
- POSTGRES_USER=laravel
- POSTGRES_DB=laravel
おわりに
コード全体です。
以上です。