Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/markhilton/docker-php-fpm

Docker image of PHP-FPM engine
https://github.com/markhilton/docker-php-fpm

Last synced: about 1 month ago
JSON representation

Docker image of PHP-FPM engine

Awesome Lists containing this project

README

        

# PHP-FPM Docker Images

Docker container to install and run [PHP-FPM](https://php-fpm.org/).

## Project Goal

Out of the box, multi-version, fully loaded PHP-FPM docker images, that can support all my PHP projects. I work with WordPress & Laravel.
The images are no light weight. The aim is to support maximum number of features out of the box, that could be easily turn ON/OFF with environment settings.

## Supported branches and respective Dockerfile links

- 8.2 [Dockerfile](https://github.com/markhilton/docker-php-fpm/blob/master/8.2/Dockerfile)
- 8.1 [Dockerfile](https://github.com/markhilton/docker-php-fpm/blob/master/8.1/Dockerfile)
- 8.0 [Dockerfile](https://github.com/markhilton/docker-php-fpm/blob/master/8.0/Dockerfile)
- 7.4 [Dockerfile](https://github.com/markhilton/docker-php-fpm/blob/master/7.4/Dockerfile)
- 7.3 [Dockerfile](https://github.com/markhilton/docker-php-fpm/blob/master/7.3/Dockerfile)
- 7.2 [Dockerfile](https://github.com/markhilton/docker-php-fpm/blob/master/7.2/Dockerfile)
- 7.1 [Dockerfile](https://github.com/markhilton/docker-php-fpm/blob/master/7.1/Dockerfile)
- 5.6 [Dockerfile](https://github.com/markhilton/docker-php-fpm/blob/master/5.6/Dockerfile)

## What is PHP-FPM ?

PHP-FPM (FastCGI Process Manager) is an alternative FastCGI implementation for PHP.

## Environment variables

Use following environment variables to configure docker container php process manager during container boot up:

### [system user](https://manpages.debian.org/stretch/adduser/adduser.8.en.html)

```bash
PHP_UID=1000
PHP_GID=1000
PHP_HOME=/app
PHP_USER=php-fpm
```

will run create a system user called `php-fpm` with UID:GUID 1000:1000 and home directory `/app`, which then can be referenced in your php-fpm manager pool configuration file.

### [php.ini configuration](http://php.net/manual/en/ini.php)

```bash
PHP_INI_PATH=/path/to/php.ini
```

will include specified `php.ini` configuration during php-fpm manager start. It allows to use a wildcard in case you would like to include several .ini configuration files.

### [php-fpm pool configurations](http://php.net/manual/en/install.fpm.configuration.php)

```bash
PHP_POOL_PATH=/path/to/pool.conf
```

will include specified `pool.conf` configuration during php-fpm manager start. It allows to use a wildcard in case you would like to include several .conf configuration files.
**ATTENTION:** default `www.conf` pool configuration will be loaded, unless you specify path to your custom `www.conf`.

### boot scripts

```bash
PHP_BOOT_SCRIPTS=/path/to/*.sh
```

will run scripts or a single script from specified path during container boot, before php-fpm manager starts up. Useful in cases when you want to include several pools configurations, where each pool uses a different system user (shared hosting). In those cases you would need to create each system user before php-fom manager starts up. `PHP_BOOT_SCRIPTS` could be use to point to a bash script that will create those system users.

### [crontabs](http://crontab.org/)

```bash
PHP_CRONTABS_PATH=/path/to/cronttab_scripts
```

will install a crontab defined in `/path/to/cronttab_scripts` and start crontab daemon inside container.

**example Laravel crontab**

```bash
#
# Laravel task scheduler
#
# ATTENTION:
# crontab sh shell requires:
# - a full path to php cli interpreter
# - current dir change to laravel artisan
# - an empty line is required at the end of this file for a valid cron file

* * * * * php-cli cd /app && /usr/local/bin/php artisan schedule:run
```

### [NewRelic APM](https://docs.newrelic.com/docs/agents/php-agent/getting-started/introduction-new-relic-php)

```bash
NEWRELIC_LICENSE=license_string
```

will turn on NewRelic extension to monitor PHP application performance.

### [SendGrid](https://sendgrid.com/)

starting from latest 7.3 container the Sendgrid login & password credentials are deprecated in favor of API key.

_deprecated:_

```bash
SMTP_LOGIN=sendgrid_login
SMTP_PASSWORD=sendgrid_password
```

_in favor of API key:_

```bash
SENDGRID_API_KEY=api_key_string
```

will update default email routing via SendGrid. Google Cloud blocks SMTP port 25 by default, so this could be useful solution to set up an alternative email routing before php-fpm manager starts up.

```bash
[email protected]
```

if set, on container boot the test script will send an email using PHP mail function to given recipient address.

### [session handler](http://php.net/manual/en/class.sessionhandler.php)

to support Redis or Memcached PHP session handler.

```bash
PHP_SESSION_HANDLER=php_session_handler
PHP_SESSION_PATH=php_session_path
```

will update default PHP session handler. Useful in cluster environments, to allow shared PHP sessions between cluster instances.

**[Example Redis session]**(https://www.digitalocean.com/community/tutorials/how-to-set-up-a-redis-server-as-a-session-handler-for-php-on-ubuntu-14-04)

```bash
PHP_SESSION_HANDLER=redis
PHP_SESSION_PATH=tcp://redis.host:6379
```

This will set php.ini global session handler to use Redis server accessible at
`redis.host` DNS endpoint name and port 6379.

**[Example Memcached session]**(https://www.digitalocean.com/community/tutorials/how-to-share-php-sessions-on-multiple-memcached-servers-on-ubuntu-14-04)

```bash
PHP_SESSION_HANDLER=memcached
PHP_SESSION_PATH=memcached.host:11211
```

This will set php.ini global session handler to use Memcached server accessible at `memcached.host` DNS endpoint name and port 11211.

### [Supervisord](http://supervisord.org/)

```bash
SUPERVISORD_PATH=/path/to/supervisord.conf
```

Allows to control and monitor multiple processes running inside the container. Example use case: ensure that there are minimum 8 simultaniously run Laravel Queues available at any time to process scheduled tasks.

Note that if you use supervisord the container boot script will create a `/healthcheck` file to monitor supervisord main process, which can be used to monitor container health. This example configuration for `docker-compose.yaml` will ensure that container does not exit after boot and redirect supervisord logs into stdout.

```bash
command: [ "tail", '-f', '/var/log/supervisor/supervisord.log' ]
healthcheck:
test: /healthcheck
retries: 3
timeout: 5s
interval: 5s
```

### php access log (on|off)

```bash
PHP_ACCESS_LOG=off
```

turns on|off php access log to docker container stdout.

### php error log (on|off)

```bash
PHP_ERROR_LOG=on
```

turns on|off php error log to docker container stdout.

## Installed extensions

- apc
- apcu
- bcmath
- bz2
- calendar
- Core
- ctype
- curl
- date
- dba
- dom
- ds
- enchant
- exif
- fileinfo
- filter
- ftp
- gd
- gettext
- gmp
- hash
- iconv
- igbinary
- imagick
- imap
- interbase
- intl
- json
- ldap
- libxml
- mbstring
- memcache
- memcached
- mongodb
- msgpack
- mysqli
- mysqlnd
- newrelic
- openssl
- pcntl
- pcre
- PDO
- pdo_dblib
- pdo_mysql
- pdo_pgsql
- pdo_sqlite
- pdo_sqlsrv
- pgsql
- Phar
- posix
- pspell
- readline
- recode
- redis
- Reflection
- session
- shmop
- SimpleXML
- soap
- sockets
- sodium
- SPL
- sqlite3
- ssh2
- standard
- sysvmsg
- sysvsem
- sysvshm
- test
- tidy
- tokenizer
- wddx
- xdebug
- xml
- xmlreader
- xmlrpc
- xmlwriter
- xsl
- Zend OPcache
- zip
- zlib

## Installed Zend Modules

- Xdebug
- Zend OPcache

## Pull latest image

```sh
docker pull crunchgeek/php-fpm:7.2
```

## Running PHP apps

### Running image

Run the PHP-FPM image, mounting a directory from your host.

```sh
docker run -it --name php-fpm -v /path/to/your/app:/app crunchgeek/php-fpm:7.2 php script.php
```

or using [Docker Compose](https://docs.docker.com/compose/):

```sh
version: '3'
services:
php-fpm:
container_name: php-fpm
image: crunchgeek/php-fpm:7.3
entrypoint: php index.php
volumes:
- /path/to/your/app:/app
```

### Running as server

```sh
docker run --rm --name php-fpm -v /path/to/your/app:/app -p 8000:8000 crunchgeek/php-fpm:7.2 php -S 0.0.0.0:8000 /app/index.php
```

### Logging

```sh
docker logs php-fpm
```

# Listing installed extensions

```sh
docker run --rm -it crunchgeek/php-fpm:7.2 php -m
```

# Release Notes

## PHP-FPM 7.4

Extensions that failed to build from 7.3 to [7.4](https://www.php.net/ChangeLog-7.php):

- mhash (Implemented RFC: The hash extension is now an integral part of PHP and cannot be disabled)
- interbase (Unbundled the InterBase extension and moved it to PECL)
- recode (Unbundled the recode extension)
- wddx (Deprecated and unbundled the WDDX extension)
- docker-php-ext-configure gd --with-png [only PNG](https://github.com/docker-library/php/issues/912)