EC出品システム(WebShopCreator)のDocker化が完了しました。
EC出品システム(WebShopCreator)のDocker化が完了!
いやぁ~長い闘いでした。
詰まったところは主に下記2点
- php-mecabがインストールできない
- php-mecabをインストールしたがPHPで認識されていない (\MeCab\Taggerが動かない)
ポイントは【php-devel(又はphp-dev)のインストール】と【Additional .ini / php.ini への登録】でした。
OSによるphp-develのインストール方法の違い
php-devel(php-dev)とは
phpの開発者パッケージの事です。
このパッケージがインストールされていると【phpize】というコマンドが利用できます。
そして、phpizeでインストールするとOS所定の位置に *.so ファイルを作成してくれます。
※所定の場所に *.so ファイルがあるとPHP側でモジュールとして認識され、PHP側からコマンドで呼び出せるようになります。
autoconfを利用しても同じ結果を獲る事が出来ますが、こちらは自由度が高すぎて初級向きではありません。
CentOSの場合
CentOS用の開発パッケージは【php-devel】になります。
ネット上に参考記事が一番多くあるので設定自体は特に苦労しないと思います。
FROM centos:7
#基本パーツの登録
RUN yum update -y
RUN yum install -y sudo vim zip unzip wget rpm curl systemctl
#リポジトリ
RUN yum install -y epel-release \
&& yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \
&& yum clean all
#Apache/PHP
RUN yum -y install httpd httpd-tools openssh-server openssh-clients openssl which
RUN yum -y install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-mysqlnd php-pear php-opcache
#composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
#libmcrypt, supervisor
RUN yum install --enablerepo=epel -y libmcrypt supervisor \
&& yum clean all
・・・・・以下略・・・・・
リポジトリをとってyum でインストール可能。悩まず行けます。
Debianの場合
最初使っていたイメージが『php:7.0-apache』だったため、特に意識もせずDebianでの構築を行っていました。
まぁこれがハマる切っ掛けだったのですが...。
Debianではphp-devが開発パッケージになります。
参考サイトにある様にこんな事をしました。
FROM php:7.4-apache
#必要なコマンド取得
RUN apt-get install -yqq git wget rpm
WORKDIR /etc/php/7.4/remi
RUN wget https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# php
RUN apt-get update
RUN apt install -y software-properties-common
RUN add-apt-repository ppa:ondrej/php
RUN apt-get update \
&& apt-get install -y php7.4 php7.4-common php7.4-cli php7.4-fpm php7.4-mysql php7.4-dev php7.4-mbstring php7.4-zip
# apache
RUN apt-get install -y apache2 \
&& apt-get install -y libapache2-mod-php7.4
・・・・・以下略・・・・・
すると、こんな事を言われました。
Package php7.4-dev is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source E: Package 'php7.4-dev' has no installation candidate
ちなみに、利用イメージが php:7.0-apache から php:7.4-apache になったのはphp-devが見つからないと言われ調べた結果、php7.4-dev は存在する事が分かったからです。
しかし、apt-get でインストールしようとすると失敗を繰り返すと...。
この原因については今に至っても解決できていません。
Ubuntuの場合
システムのDocker化は最終的にUbuntuで実装しました。
GUIで有名なUbuntuですが Dockerイメージとしても人気あるみたいで、参考記事はCentOSに次いで多くとても助かりました。また、Debianと兄弟のようなOSであるため、悩み続けたDebianのDockerfileをそのまま利用できる事も大きな利点でした。
Ubuntuでも開発パッケージはphp-devとなります。
FROM ubuntu:latest
#基本パーツ
RUN apt-get update && apt-get install -y vim zip unzip
#PHPインストール
RUN apt-get update
RUN apt install -y software-properties-common
RUN add-apt-repository ppa:ondrej/php
RUN apt-get update \
&& apt-get install -y php7.4 php7.4-common php7.4-cli php7.4-fpm php7.4-mysql php7.4-dev php7.4-mbstring php7.4-zip
#Apacheインストール
RUN apt-get install -y apache2 \
&& apt-get install -y libapache2-mod-php7.4
COPY 000-default.conf /etc/apache2/sites-available/
COPY supervisord.conf /etc/apache2/sites-available/
#composer設定
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
・・・・・以下略・・・・・
Debianで泣かされたphp-devが見つからないコールは全く発生せず、すんなりとインストール完了。
もっと早くUbuntuで実装すればよかったと後悔です。
Alpineの場合
軽量OSと言う事で、最近の記事が沢山あります。
その為、Ubuntu実装の前にAlpineをためしていました。
これも開発者パッケージはphp-dev で、インストールはとても簡単です。
FROM php:7.3-fpm-alpine
# Add repos
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
# tinker(psysh)
ARG PSYSH_DIR=/usr/local/share/psysh
RUN set -eux \
&& apk update \
&& apk add --update --no-cache --virtual=.build-dependencies \
autoconf \
gcc \
g++ \
make \
tzdata \
git \
&& apk add --update --no-cache \
icu-dev \
libzip-dev \
・・・・・以下略・・・・・
特にphp-devを登録しなくても使えてしまうという...。
ただし、私は Additional.ini / php.ini に登録してもPHP側でMeCabをモジュールとして認識してくれないという事態に遭遇し、Alpineでの構築は断念しました。
OSによるファイル の場所の違い
Additional.ini /php.ini の設置場所
この2つのファイルはOSだけではなく環境によっても変わるのだと思います。
この2つの場所の確認はとても簡単です。phpファイル(又はhtmlファイル)に<?php phpinfo();?> を記載しロードするだけです。
表示されるphpの構成ファイルの最初の方に Additional.ini /php.ini の設置場所が書いてあります。
後はその場所をめがけて『copy でファイルそのものを置き換える』か『echo で要素を上書きする』かを選択して実行するだけです。
悩んだ辞書ファイル(mecab-ipadic-neologd)の置き場所
私はAdditional.ini を次のように構成しました。
ファイル名:mecab.ini
extension=mecab.so mecab.default_dicdir=/usr/local/lib/mecab/dic/mecab-ipadic-neologd/
そうしたところ、Laravelから「そんな場所にファイルはねぇ」と怒られてしまいました。
/usr/local/lib/mecab/dic/mecab-ipadic-neologd
これはCentOS7での標準な置き場所なんです。
Ubuntu では次の場所でした。
/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/
全然違う...。
mecab-ipadic-neologd 標準インストール時の辞書ファイル置き場
コマンド一発で探せます。
echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
このコマンドが無かったら、まだしばらく彷徨っていた事でしょう。
まとめ
色々やってみて実感した事。
Dockerを使ってLaravelでMeCabを動かすならOSはUbuntuが楽。


