Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docker-compose ファイルを分割する #4955

Merged
merged 5 commits into from
Mar 30, 2021

Conversation

nanasess
Copy link
Contributor

@nanasess nanasess commented Mar 9, 2021

概要(Overview・Refs Issue)

方針(Policy)

  • docker-compose.yml の標準DBを SQLite3 にし、 PostgreSQL, MySQL はオプションとする
    • RDBMS を変更したい場合は docker-compose コマンドに -f docker-compose.(mysql|pgsql).yml を付与する
  • ローカルボリュームをマウントしたい場合は -f docker-compose.dev.yml を付与する
  • DATABASE_URL をはじめとする環境変数は docker-compose*.yml に設定する
    • APP_ENV は entrypoint 実行時に環境変数より設定される。優先順位は以下の通り
      1. docker-compose*.yml の environment
      2. ローカルディレクトリの .env(phpdotenv ではなく docker-compose 経由で設定される)
      3. ec-cube コンテナの .env(phpdotenv で設定される)
  • docker-compose-owaspzap.yml も上記命名規則に合わせて docker-compose.owaspzap.yml に変更

既知の問題

  • 環境変数は docker-compose ファイルに設定するため、 .env の設定は無視される
    • docker-compose.yml で APP_ENV: ~ とすれば .env の設定が優先されるはずだが、何故か APP_ENV=dev になってしまい、 .env との両立ができない
    • build した時の設定が引き継がれる模様

使用方法

SQLite3 または DB を別途用意する場合

docker-compose up

PostgreSQL を使用する場合

docker-compose.pgsql.yml を指定します。

docker-compose -f docker-compose.yml -f docker-compose.pgsql.yml up

MySQL を使用する場合

docker-compose.mysql.yml を指定します。

docker-compose -f docker-compose.yml -f docker-compose.mysql.yml up

ローカル環境をマウントする場合

docker-compose.dev.yml を指定します。

## MySQL を使用する例
docker-compose -f docker-compose.yml -f docker-compose.mysql.yml -f docker-compose.dev.yml up

OWASP ZAP を使用する場合

docker-compose -f docker-compose.yml -f docker-compose.mysql.yml -f docker-compose.dev.yml -f  docker-compose.owaspzap.yml up

実装に関する補足(Appendix)

  • EC-CUBEのインストールは、コンテナの起動後に実行する必要がある
  • 公式ドキュメントも修正が必要

テスト(Test)

TODO(E2Eテストを docker-compose 経由で実施したい)

相談(Discussion)

以下のように index.php を修正すれば、上記既知の問題も解消するが、下位互換性に問題がありそう
entrypoint で APP_ENV を設定することで解消済み

diff --git a/index.php b/index.php
index 103b4e62fd..e055c4144e 100644
--- a/index.php
+++ b/index.php
@@ -18,7 +18,7 @@ if (!file_exists($autoload) && !is_readable($autoload)) {
 require $autoload;

 // The check is to ensure we don't use .env in production
-if (!isset($_SERVER['APP_ENV'])) {
+if (!empty($_SERVER['APP_ENV'])) {
     if (!class_exists(Dotenv::class)) {
         throw new \RuntimeException('APP_ENV environment variable is not defined. You need to define environment variables for configuration or add "symfony/dotenv" as a Composer dependency to load variables from a .env file.');
     }

マイナーバージョン互換性保持のための制限事項チェックリスト

  • 既存機能の仕様変更
  • フックポイントの呼び出しタイミングの変更
  • フックポイントのパラメータの削除・データ型の変更
  • twigファイルに渡しているパラメータの削除・データ型の変更
  • Serviceクラスの公開関数の、引数の削除・データ型の変更
  • 入出力ファイル(CSVなど)のフォーマット変更

レビュワー確認項目

  • 動作確認
  • コードレビュー
  • E2E/Unit テスト確認(テストの追加・変更が必要かどうか)
  • 互換性が保持されているか
  • セキュリティ上の問題がないか

@nanasess
Copy link
Contributor Author

APP_ENV をコンテナ起動時に entrypoint で設定されるようにしました。これにより、 .env ファイルと docker-compose の environment が両立できます

設定される優先順位は以下の通りです

  1. docker-compose*.yml の environment
  2. ローカルディレクトリの .env(phpdotenv ではなく docker-compose 経由で設定される)
  3. ec-cube コンテナの .env(phpdotenv で設定される)

以下のようにして ec-cube コンテナを up することで、ec-cube コンテナ内の .env の設定値も利用できます

  • docker-compose*.yml で APP_ENV: ~ とする
  • ローカルディレクトリの .env の APP_ENV をコメントアウトする

@chihiro-adachi
Copy link
Contributor

@nanasess
ありがとうございます。動作確認しました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
document Improvements or additions to documentation improvement 機能改善 Status: ready-for-merge
Projects
None yet
Development

Successfully merging this pull request may close these issues.

docker-compose環境の標準DBをSQLiteにし、MySQL/Postgresはオプションにする
3 participants