tag:crieit.net,2005:https://crieit.net/tags/ash/feed
「ash」の記事 - Crieit
Crieitでタグ「ash」に投稿された最近の記事
2022-05-10T22:39:48+09:00
https://crieit.net/tags/ash/feed
tag:crieit.net,2005:PublicArticle/18186
2022-05-10T22:39:48+09:00
2022-05-10T22:39:48+09:00
https://crieit.net/posts/docker-php-7-alpine-use-composer-and-xdebug-20220510
Docker の php:7-alpine イメージで Composer と Xdebug を使えるようにする
<h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/slimphp/Slim-Skeleton">slimphp/Slim-Skeleton</a> を利用したいと考えました。</p>
<p>手元の端末で開発しようとしたところ、 XAMPP に Xdebug を入れ忘れていたことに気付きました。しかも、 XAMPP の PHP のバージョンで Xdebug のインストールが止まってしまいました。</p>
<p>そこで、スケルトンプロジェクトに付随している Docker Compose での開発を試みましたが、この Docker Compose 内で pull してくるイメージは Composer も Xdebug もないので入れることにしました。</p>
<h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2>
<h3 id="ディレクトリ構造"><a href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0">ディレクトリ構造</a></h3>
<pre><code>root/
├ _docker/ // Dockerに関する設定置き場
│ ├ dockerfiles/
│ │ ├ settings/
│ │ │ └ php.ini // PHPの設定 (Xdebug 有効化)
│ │ │
│ │ └ Dockerfile
│ │
│ ├ mysql/ // MariaDB 用ディレクトリ
│ │ └ .gitkeep
│ │
│ └ phpmyadmin/
│ ├ conf/
│ │ └ phpmyadmin-misc.ini // phpMyAdmin の設定 (メモリ上限など)
│ │
│ └ sessions/
│ └ .gitkeep
│
└ docker-compose.yml
</code></pre>
<p>Docker に関する部分のみ列挙。</p>
<h3 id="docker-compose.yml"><a href="#docker-compose.yml">docker-compose.yml</a></h3>
<pre><code class="yml">version: '3.7'
volumes:
logs:
driver: local
services:
slim:
build:
context: ./_docker/dockerfiles/
dockerfile: Dockerfile
working_dir: /var/www
command: php -S 0.0.0.0:8080 -t public
environment:
docker: "true"
ports:
- 8080:8080
volumes:
- .:/var/www
- ./logs:/var/www/logs
db:
image: mariadb
restart: always
ports:
- 3306:3306
volumes:
- ./_docker/mysql/mysql:/var/lib/mysql
- ./_docker/mysql/initdb.d:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD=pwd
- MYSQL_DATABASE=test
- MYSQL_USER=user
- MYSQL_PASSWORD=pwd
phpmyadmin:
image: phpmyadmin/phpmyadmin
volumes:
- ./_docker/phpmyadmin/sessions:/sessions
- ./_docker/phpmyadmin/conf/phpmyadmin-misc.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini
environment:
- PMA_ARBITRARY=1
- PMA_HOST=db
- PMA_USER=user
- PMA_PASSWORD=pwd
ports:
- 8081:80
</code></pre>
<p>変更点は以下。</p>
<ul>
<li>PHP 用環境: <code>Dockerfile</code> を使ったイメージにカスタマイズ</li>
<li>DB: MariaDB のイメージをそのまま利用
<ul>
<li><code>environment</code> のパラメータはそのまま使用。アプリケーションや phpMyAdmin 側と動機は取れていないですがひとまずはこれで……</li>
</ul></li>
<li>phpMyAdmin: これも phpMyAdmin 公式イメージを流用</li>
</ul>
<h3 id="_docker/dockerfiles/Dockerfile"><a href="#_docker%2Fdockerfiles%2FDockerfile">_docker/dockerfiles/Dockerfile</a></h3>
<pre><code class="Dockerfile">FROM php:7-alpine
RUN apk --update add curl
RUN set -ex \
&& apk --no-cache add \
autoconf build-base
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
RUN docker-php-ext-install pdo_mysql
COPY settings/php.ini /usr/local/etc/php/conf.d
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
</code></pre>
<p><code>php:7-alpine</code> をベースに Xdebug と Composer を追加。</p>
<h3 id="_docker/dockerfiles/settings/php.ini"><a href="#_docker%2Fdockerfiles%2Fsettings%2Fphp.ini">_docker/dockerfiles/settings/php.ini</a></h3>
<pre><code class="ini">xdebug.mode=coverage
</code></pre>
<p>Xdebug でカバレッジを有効化するための設定を追加するため。なお、 <code>Dockerfile</code> で <code>COPY</code> する際のホストマシンでのパスは <strong><code>Dockerfile</code> の存在するディレクトリから下でないと参照できない</strong> という地味な制約があるので <code>dockerfiles</code> ディレクトリをわざわざ掘りました。</p>
<h3 id="_docker/phpmyadmin/conf/phpmyadmin-misc.ini"><a href="#_docker%2Fphpmyadmin%2Fconf%2Fphpmyadmin-misc.ini">_docker/phpmyadmin/conf/phpmyadmin-misc.ini</a></h3>
<pre><code class="ini">allow_url_fopen = Off
max_execution_time = 600
memory_limit = 64M
post_max_size = 64M
upload_max_filesize = 64M
</code></pre>
<p>メモリ上限等のカスタマイズ。</p>
<hr />
<p>これで今回はカバレッジ出力まで動作することを確認しました。</p>
<h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2>
<h3 id="Xdebug"><a href="#Xdebug">Xdebug</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sachiko-kame/items/bf5480f4d7c751ab28aa">PHPUnitでHTMLコードカバレッジを出すまで(Docker使用) - Qiita</a></li>
</ul>
<blockquote>
<p>Warning: XDEBUG_MODE=coverage or xdebug.mode=coverage has to be set</p>
</blockquote>
<p>が出たので step3 について実施。</p>
<p>なお、今回のケースでは</p>
<pre><code>extension=xdebug.so
</code></pre>
<p>は不要だった。</p>
<h2 id="Dockerfile"><a href="#Dockerfile">Dockerfile</a></h2>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://crudzoo.com/blog/php-docker">Dockerで作るNginx + PHP7 + Xdebug環境 | Crudzoo</a></li>
</ul>
<p>ほぼこれでOK.</p>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ucan-lab/items/fbf021bf69896538e515">php-alpineコンテナにxdebugをインストールする時にハマったメモ - Qiita</a></li>
</ul>
<p>こちらも参照。 <code>php -v</code> で <code>with Xdebug</code> と付いていればOK。</p>
<h4 id="Dockerfile の COPY"><a href="#Dockerfile+%E3%81%AE+COPY">Dockerfile の COPY</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://scrapbox.io/taka521-tech-notes/%E3%80%90Docker%E3%80%91COPY%E3%81%A7%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%E3%80%81Dockerfile%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%8B%E3%82%89%E3%81%AE%E7%9B%B8%E5%AF%BE%E3%83%91%E3%82%B9%E3%81%A7%E3%80%81%E8%A6%AA%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E8%A6%8B%E3%82%8C%E3%81%AA%E3%81%84">【Docker】COPYで指定されたファイルは、Dockerfileが存在するディレクトリからの相対パスで、親ディレクトリを見れない - タカの技術ノート</a></li>
</ul>
<h3 id="Mariadb"><a href="#Mariadb">Mariadb</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://mebee.info/2020/04/07/post-8227/">dockerを使用してmariadbを構築する | mebee</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tarch710/items/1236a23f7ffde4c512f2">開発環境をDockerにしたら、PDOでcould not find driverが出た - Qiita</a></li>
</ul>
<blockquote>
<p>could not find driver</p>
</blockquote>
<p>普通に考えたら確かにドライバがないので追加して解決。</p>
<h3 id="シェル"><a href="#%E3%82%B7%E3%82%A7%E3%83%AB">シェル</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yutachaos/items/56dd7ea09d7e2b0d9173">dockerでalpine linux ベースのcontainerに入って、shellを使いたいとき。 - Qiita</a></li>
</ul>
<p>bash ではなく ash 。 <code>bin/ash</code> 指定。</p>
<h3 id="sr -c"><a href="#sr+-c">sr -c</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://genzouw.com/entry/2020/01/28/120014/1910/">docker-compose.ymlのcommandプロパティに複数コマンドを設定する方法 | ゲンゾウ用ポストイット</a></li>
</ul>
<p>最終的には使わずに済みましたが念のためメモ。</p>
arm-band