小ネタ:Docker-ComposeでEC-CUBEの開発環境を作った顛末

随分昔の話*1、Docker-Composeを使ってEC-CUBEの開発環境を作ってみたのですが、そこそこハマったので備忘録を兼ねたメモを作っておきます。何かの参考になれば幸いです。

Docker/Docker-Composeが実行できる環境を作る

詳細は割愛します。公式ページで確認をしてください。

ちなみに、私はLinuxでの環境構築をしていますが、「いろいろと面倒なので*2」Docker/Docker-Composeはそのままインストールして、実行時に管理者権限が必要な状態のままにしています。

「開発環境を作った」顛末

EC-CUBEのカスタマイズ案件を受注したわけですが、普段の開発環境(Linuxデスクトップ)では面倒だったので直接Webサーバを立てて作業をしていました。で、外出先でも作業をしなくてはならなくなり、ノートPC*3に環境構築をするにあたり、あまりWebサーバを立てたままでノートを使いたくないなぁ、と考えてDockerで構築することを思いつきました。サクッといくかな、と思っていましたが結構なハマり具合で、しかもメモを取りながらの構築なので、なんとなくですがこのままだと開発環境の構築だけで外出先での作業が終わり、翌日にはいつもの作業場の作業環境で開発に戻れそうな予感がしています*4

(いわゆる)LAMP環境をDocker(-Compose)で構築する

まず参考にしたのはこのあたり *5

qiita.com

単純に「PHP-ApacheMySQL」のコンテナを入れるだけではどうやら済まないようです。話が前後しますが、素のままのコンテナ(php:7.2-apache)を使うと必須モジュールが不足していると言われます。そこで、php-apacheコンテナはDockerfileを使ってカスタマイズをします*6

最低限、

  • [必須] zip 拡張モジュールが有効になっていません。 システム要件をご確認ください。
  • [必須] pdo_pgsql又はpdo_mysql 拡張モジュールを有効にしてください。 システム要件をご確認ください。

の2エラーが出るので、DockerfileのRUN apt-get installのあとに記述します。

FROM php:7.2-apache
  # PHPのExtensionをインストール.
RUN apt-get update && \
  apt-get install -y zlib1g-dev && \
  docker-php-ext-install pdo_mysql zip

WORKDIR /var/www/html

EXPOSE 80

キモはFROMで指定したコンテナイメージに対して、RUNコマンドでイメージに「コマンド」の実行をする、というところです。 Dockerの(というか本来の「仮想化」の)あるべき姿としては、できるだけメンテナンスフリーにしたいので、仮想化コンテナにしても理想は提供されているそのまま、カスタマイズも最低限にしたいわけです。カスタマイズしたことによる問題点の切り分けがしやすくなりますし、事前にチェックが可能にもなります。 Dockerfileにしても、Vagrantとペアで使うことの多いChefにしても、カスタマイズをした箇所が明示されているという点では便利で(もちろん「構成ツール」であり『レシピ』なので設計する側から見ても便利です)、多く使われているのにも納得がいきます。

もう1点、phpのZIPモジュールインストールのためにzipのライブラリをaptでインストールしておく必要があることにも注意です。 で、最初はdocker-compose build、次からはdocker-compose up -d*7とすればOK*8

EC-CUBEをインストールする

これまた公式のダウンロードページからファイル一式をダウンロードします。zip形式なので解凍しておきます。このディレクトリをそのままDockerのボリュームとして使うことになるのですが、(コンテナ側の)Apacheのユーザが所有者としておかないとApache側で403(Forbidden)エラーを吐くので、ec-cube以下のファイル・フォルダの所有者を「www-data」にする(コンテナのOSがDebian系なので)というひと手間が必要です((実際の開発/カスタマイズではファイルの保存時に必ず管理者権限が必要になったりはしてしまいますが、もはや「慣れ」のレベル。VS Codeを使ってコードを書き、保存時には必ず「sudoでもう一度保存」と聞かれ、都度パスワードを入れて、新しくファイルを作りたければコンソールからsudo touchで。いやはやVS Codeさまさまですわ。))。

で、結局開発は進んだのか

このネタのおかげかどうかはわかりませんが、数か月後に立て続けにEC-CUBE案件の引き合いがあって、一つの案件に至っては参考のためのサーバまで結局構築をしてしまうほどEC-CUBEにのめり込んでおります。

*1:と言っても2019年末くらいの話です。

*2:いちいちsudoを叩くのが面倒だという方も多いとは思いますが...。

*3:「例の(Dellの)」ジャンクノートです。

*4:本末転倒ですが、ブログのネタが一つ増えたので良しとしています(笑)。

*5:Docker-ComposeでLAMP環境を作る、という観点で参考にしています。実際のところは、このあとでも述べているとおりPHPのモジュールが不足し、php-apacheのコンテナにモジュールのインストールをすることになるので、php-apacheはDockerfileでカスタマイズをし、それ以外のコンテナは素のまま使うことにしました。

*6:「Docker-compose EC-CUBE」で検索するとQiitaに山ほど記事があることがわかります。考えることはみんな一緒ですなぁ。

*7:dオプションでバックグラウンド(デーモンとして)起動です。

*8:あとで調べればいいんですがメモ。ノートでの開発で、持ち運び時にはdockerのことを気にせずに電源を落としているんですが、本当はアカンのですよね...。