Konfigurasi Docker PHP untuk Google Cloud Run

Bagaimana konfigurasi untuk menjalankan PHP di docker? Kali ini saya mencoba untuk membagikan tentang minimal konfigurasi untuk dockerfile PHP khususnya untuk dideploy di Google Cloud Run. Ada beberapa kasus yang mana kita hanya memerlukan basic feature dari PHP bahkan yang dideploy hanya berupa static page sederhana. Tetapi tak jarang pula kita memerlukan konfigurasi composer dan penambahan plugin extension dari PHP.

Sebelumnya, kita coba bagi dalam beberapa section. Pertama, konfigurasi dasar dan beberapa mod. Kedua, konfigurasi ext tambahan di PHP. Ketiga, memasang composer dan menginstall berbagai library melalui composer di docker.

Konfigurasi Dasar

1
2
3
4
5
6
7
8
9
10
11
12
FROM php:7.4-apache

WORKDIR /var/www/html

# mengubah port dari 80 ke PORT (8080 di GCR)
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

# atau gunakan aja custom file conf dan mereplace 000-default.conf
COPY vhost.conf /etc/apache2/sites-available/000-default.conf

# pastikan php.ini sudah diset
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

Untuk mengaktifkan mod seperti rewrite dan header bisa dilakukan dengan a2enmod.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM php:7.4-apache

WORKDIR /var/www/html

# aktifkan mod
RUN a2enmod rewrite
RUN a2enmod header

# mengubah port dari 80 ke PORT (8080 di GCR)
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

# atau gunakan aja custom file conf dan mereplace 000-default.conf
COPY vhost.conf /etc/apache2/sites-available/000-default.conf

# pastikan php.ini sudah diset
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

Konfigurasi Ext PHP

Sebenarnya kunci utama untuk menambahkan extension di PHP hanya sebaris ini. Tinggal tambahkan saja ext yang ingin dipasang dalam baris itu. Contohnya menambahkan ext opcache dan pdo_mysql.

1
RUN docker-php-ext-install -j "$(nproc)" opcache pdo_mysql

Tetapi untuk beberapa kasus ext lain memerlukan langkah tambahan. Beberapa diantaranya seperti gd, intl, imap, dan imagick.

gd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
RUN apt-get update \
&& apt-get install -y \
libfreetype6-dev \
libpng-dev \
libjpeg-dev \
&& docker-php-ext-configure gd \
--with-freetype-dir=/usr/include/ \
--with-jpeg-dir=/usr/include/ \
--with-png-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) \
gd \
&& apt-get purge -y \
libfreetype6-dev \
libpng-dev \
libjpeg-dev

intl

1
2
3
4
5
6
7
RUN apt-get update \
&& apt-get install -y \
libicu-dev \
&& docker-php-ext-install -j$(nproc) \
intl \
&& apt-get purge -y \
libicu-dev

imap

1
2
3
4
5
6
7
8
9
10
11
RUN apt-get update \
&& apt-get install -y libc-client-dev libkrb5-dev \
&& docker-php-ext-configure imap \
--with-kerberos \
--with-imap-ssl \
&& docker-php-ext-install -j$(nproc) \
imap \
&& apt-get purge -y \
libc-client-dev \
libkrb5-dev

imagick(pecl)

1
2
3
4
5
6
7
8
9
10
RUN apt-get update \
&& apt-get install -y \
libmagickwand-dev --no-install-recommends \
ghostscript --no-install-recommends \
&& pecl install \
imagick \
&& docker-php-ext-enable \
imagick \
&& apt-get purge -y \
libmagickwand-dev

Zip

1
2
3
4
5
6
7
RUN apt-get update \
&& apt-get install -y \
libzip-dev \
&& docker-php-ext-install -j$(nproc) \
zip \
&& apt-get purge -y \
libzip-dev

Konfigurasi Composer

1
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer && chmod +x /usr/bin/composer

Setelah composer terinstall, kita bisa memasang library yang dibutuhkan dalam project. Tetapi perlu diperhatikan bahwa ketika melakukan composer install kita harus memberikan parameter tambahan supaya composer melakukan instalasi tanpa meninggalkan cache dan "sampah" lainnya supaya image docker yang dihasilkan tidak membengkak.

1
2
3
COPY composer.json ./
COPY composer.lock ./
RUN composer install --no-dev --no-interaction --optimize-autoloader

Mungkin itu yang dapat saya bagikan. Masalah lain seperti memasang font di docker bisa dibaca disini. Semoga bermanfaat.

"Google Cloud Run Documentation for PHP" by GCP
https://cloud.google.com/run/docs/quickstarts/build-and-deploy/deploy-php-service

"Gist about list of php ext in docker" by chronon
https://gist.github.com/chronon/95911d21928cff786e306c23e7d1d3f3

"Faster Docker Builds with composer install" by Iacovos Constantinou
https://medium.com/@softius/faster-docker-builds-with-composer-install-b4d2b15d0fff


Konfigurasi Docker PHP untuk Google Cloud Run
https://reyzeal.com/2022/04/26/Konfigurasi-Docker-PHP-untuk-Google-Cloud-Run/
Author
Rey
Posted on
April 26, 2022
Licensed under