用 docker 架設 php 平台

[文章目录]
  1. 需求
    1. 問題回顧

需求

這幾日,接到一個需求要架設基於 php 的專案軟體
因為僅是 demo 用途,故直接想到用 docker 架設此環境。

架設此環境,所需資源有三:PHP、Nginx、MySQL
過去有架設過,應該問題不大,但每個專案各有不同的 php extension 需求,所以了解專案並於 docker php images 中實現是最明顯的課題。
相對 Nginx & MySQL docker images 部分,則使用官方資訊下載使用即可。
官方 Nginx image
官方 MySQL image

經過專案探尋與瞭解,也確認了需要的 php extension 清單,
基於官方 php image,加上 php extension 需求,撰寫 PHP Dockerfile 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
FROM php:5.6-fpm

RUN apt-get update \
&& apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libmcrypt-dev \
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd

RUN docker-php-ext-install mysql mysqli pdo pdo_mysql mbstring mcrypt sockets

php 專案中,基本上都需要用上 composer 指令,進行專案初始化
可使用官方 composer,並且也需要搭配 php extension 需求,撰寫 PHP Dockerfile 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM composer

RUN apk upgrade --update && \
apk --no-cache add libmcrypt-dev mysql-client libpng-dev $PHPIZE_DEPS \
&& pecl install mcrypt-1.0.1 \
&& docker-php-ext-enable mcrypt

RUN docker-php-ext-install -j$(nproc) gd mysqli
RUN docker-php-ext-install -j$(nproc) pdo pdo_mysql iconv mbstring sockets

WORKDIR /app

ENTRYPOINT ["/bin/sh", "/docker-entrypoint.sh"]

CMD ["composer"]

撰寫後,進行 docker build 工作

1
2
# docker build 指令
docker build -t tag-name ./

composer install & create-project 指令

1
2
3
4
# composer create-project project/name
sudo docker run --rm --interactive --tty -v /Documents/test:/app --user $(id -u):$(id -g) composer create-project project/name
# composer install
sudo docker run --rm --interactive --tty -v /Documents/test:/app --user $(id -u):$(id -g) composer install

寫此篇其最主要紀錄的是過程中的問題概要,留下紀錄作為後續回顧。

問題回顧

  1. 遇到問題:
    Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script. ERROR: 'phpize' failed

    • 解法:
      1
      RUN apk --no-cache add $PHPIZE_DEPS
  2. 遇到問題:執行 composer install or create-project 時,出現錯誤訊息:requested PHP extension mcrypt is missing from your system

    • 解法:其 docker image 缺少 PHP extension mcrypt ,所以需要
      1
      2
      RUN pecl install mcrypt-1.0.1
      RUN docker-php-ext-enable mcrypt
  3. 在執行專案時,遇到 php 問題:PHP Fatal error: Call to undefined function imagettftext()

    • 解法:因 imagettftext 功能相依 GD & FreeType,然而其 php extension GD 沒啟用 freetype 功能而出現此問題,在 dockerfile php 中啟用方式如下
      1
      2
      3
      RUN docker-php-ext-install -j$(nproc) iconv
      RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
      RUN docker-php-ext-install -j$(nproc) gd