Skip to content

alecyu/nginx-php-fpm

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Introduction

This is a Dockerfile to build a container image for nginx and php-fpm, with the ability to pull website code from git. The container also has the ability to update templated files with vaiables passed to docker in order to update your settings.

Git repository

The source files for this project can be found here: https://github.com/ngineered/nginx-php-fpm

If you have any improvements please submit a pull request.

Docker hub repository

The Docker hub build can be found here: https://registry.hub.docker.com/u/richarvey/nginx-php-fpm/

Versions

  • Nginx: 1.10.1
  • PHP: 5.6.21
  • Alpine Version: 3.4

Use richarvey/nginx-php-fpm:php7 tag for PHP 7.

Building from source

To build from source you need to clone the git repo and run docker build:

git clone https://github.com/ngineered/nginx-php-fpm.git
docker build -t nginx-php-fpm:latest .

Pulling from Docker Hub

Pull the image from docker hub rather than downloading the git repo. This prevents you having to build the image on every docker host:

docker pull richarvey/nginx-php-fpm:latest

Running

To simply run the container:

sudo docker run -d richarvey/nginx-php-fpm

You can then browse to http://<DOCKER_HOST>:8080 to view the default install files. To find your DOCKER_HOST use the docker inspect to get the IP address.

Volumes

If you want to link to your web site directory on the docker host to the container run:

sudo docker run -d -v /your_code_directory:/var/www/html richarvey/nginx-php-fpm

Dynamically Pulling code from git

One of the nice features of this container is its ability to pull code from a git repository with a couple of environmental variables passed at run time.

Note: You need to have your SSH key that you use with git to enable the deployment. I recommend using a special deploy key per project to minimise the risk.

Preparing your SSH key

The container expects you pass it the SSH_KEY variable with a base64 encoded private key. First generate your key and then make sure to add it to github and give it write permissions if you want to be able to push code back out the container. Then run:

base64 -w 0 /path_to_your_key

Note: Copy the output be careful not to copy your prompt

To run the container and pull code simply specify the GIT_REPO URL including git@ and then make sure you have also supplied your base64 version of your ssh deploy key:

sudo docker run -d -e '[email protected]:ngineered/ngineered-website.git' -e 'SSH_KEY=BIG_LONG_BASE64_STRING_GOES_IN_HERE' richarvey/nginx-php-fpm

To pull a repository and specify a branch add the GIT_BRANCH environment variable:

sudo docker run -d -e '[email protected]:ngineered/ngineered-website.git' -e 'GIT_BRANCH=stage' -e 'SSH_KEY=BIG_LONG_BASE64_STRING_GOES_IN_HERE' richarvey/nginx-php-fpm

Enabling SSL or Special Nginx Configs

You can either map a local folder containing your configs to /etc/nginx or we recommend editing the files within conf directory that are in the git repo, and then rebuilding the base image.

Special Git Features

You'll need some extra ENV vars to enable this feature. These are GIT_EMAIL and GIT_NAME. This allows git to be set up correctly and allow the following commands to work.

Push code to Git

To push code changes made within the container back to git simply run:

sudo docker exec -t -i <CONATINER_NAME> /usr/bin/push

Pull code from Git (Refresh)

In order to refresh the code in a container and pull newer code form git simply run:

sudo docker exec -t -i <CONTAINER_NAME> /usr/bin/pull

Templating

NOTE: You now need to enable templates see below This container will automatically configure your web application if you template your code.

Using environment variables

For example if you are using a MySQL server, and you have a config.php file where you need to set the MySQL details include $$MYSQL_HOST$$ style template tags.

Example config.php::

<?php
database_host = $$_MYSQL_HOST_$$;
database_user = $$_MYSQL_USER_$$;
database_pass = $$_MYSQL_PASS_$$
...
?>

To set the variables simply pass them in as environmental variables on the docker command line.

Example:

sudo docker run -d -e '[email protected]:ngineered/ngineered-website.git' -e 'SSH_KEY=base64_key' -e 'TEMPLATE_NGINX_HTML=1' -e 'GIT_BRANCH=stage' -e 'MYSQL_HOST=host.x.y.z' -e 'MYSQL_USER=username' -e 'MYSQL_PASS=supper_secure_password' richarvey/nginx-php-fpm

This will expose the following variables that can be used to template your code.

MYSQL_HOST=host.x.y.z
MYSQL_USER=username
MYSQL_PASS=password

Enable Templating

In order to speed up boot time templating is now disabled by default, if you wish to enable it simply include the flag below:

-e TEMPLATE_NGINX_HTML=1

Template anything

Yes ANYTHING, any variable exposed by the -e flag lets you template your configuration files. This means you can add redis, mariaDB, memcache or anything you want to your application very easily.

Logging and Errors

Logging

All logs should now print out in stdout/stderr and are available via the docker logs command:

docker logs <CONTAINER_NAME>

Displaying Errors

If you want to display PHP errors on screen (in the browser) for debugging purposes use this feature:

-e ERRORS=1

Packages

No packages published

Languages

  • Shell 73.7%
  • Nginx 25.5%
  • PHP 0.8%