Skip to main content

Shenzhen, China

Phalcon Framework with Docker

Based on Working with Phalcon Framework and Docker by Rogério Silva.

Github Repository

Scaffold your Application

Link your SQL database to your Phalcon App container using Docker-compose:

version: '3'

services:
app:
container_name: phalcon_app
build: .
working_dir: /var/www/html
volumes:
- ./html:/var/www/html
ports:
- '8080:80'
expose:
- '8080'
depends_on:
- mysql
links:
- mysql

mysql:
container_name: phalcon_db
image: mariadb:latest
environment:
MYSQL_DATABASE: phalcon_app
MYSQL_ROOT_PASSWORD: root
SERVICE_TAGS: dev
SERVICE_NAME: mysql
ports:
- '3306:3306'

Build the Phalcon Container

Using the PHP/NGINX container by webdevops as base image:

FROM webdevops/php-nginx:7.4

ARG PSR_VERSION=1.2.0
ARG PHALCON_VERSION=4.1.3
ARG PHALCON_EXT_PATH=php7/64bits

RUN set -xe && \
# Download PSR, see https://github.com/jbboehr/php-psr
curl -LO https://github.com/jbboehr/php-psr/archive/v${PSR_VERSION}.tar.gz && \
tar xzf ${PWD}/v${PSR_VERSION}.tar.gz && \
# Download Phalcon
curl -LO https://github.com/phalcon/cphalcon/archive/v${PHALCON_VERSION}.tar.gz && \
tar xzf ${PWD}/v${PHALCON_VERSION}.tar.gz && \
docker-php-ext-install -j $(getconf _NPROCESSORS_ONLN) \
${PWD}/php-psr-${PSR_VERSION} \
${PWD}/cphalcon-${PHALCON_VERSION}/build/${PHALCON_EXT_PATH} \
&& \
# Remove all temp files
rm -r \
${PWD}/v${PSR_VERSION}.tar.gz \
${PWD}/php-psr-${PSR_VERSION} \
${PWD}/v${PHALCON_VERSION}.tar.gz \
${PWD}/cphalcon-${PHALCON_VERSION} \
&& \
php -m

ENV WEB_DOCUMENT_ROOT=/var/www/html/application/public

I am using the currently latest version of php-psr in combination with the last cphalcon v4 release. I was not yet able to get version 5 to work.

Build

docker pull mariadb:latest
docker pull webdevops/php-nginx:7.4
mkdir html
docker-compose build app
docker images

docker-phalcon_app latest 08a2db66d313 6 seconds ago 1.03GB
webdevops/php-nginx 7.4 bf283e850d32 3 days ago 1.02GB
mariadb latest 8dafde72c039 4 days ago 383MB

Run the Service

docker-compose up -d

Creating network "docker-phalcon_default" with the default driver
Creating phalcon_db ... done
Creating phalcon_app ... done

Configure the Phalcon App

Initialize the application by generating a composer.json:

docker exec -ti phalcon_app composer init

This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [root/html]: phalcon/app
Description []: Phalcon App
Author [n to skip]: Mike Polinowski
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []: MIT

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no
Add PSR-4 autoload mapping? Maps namespace "Phalcon\App" to the entered relative path. [src/, n to skip]: n

{
"name": "phalcon/app",
"description": "Phalcon App",
"license": "MIT",
"authors": [
{
"name": "Mike Polinowski"
}
],
"require": {}
}

Do you confirm generation [yes]? yes

Create a default Phalcon project using the Phalcon Devtools:

docker exec -ti phalcon_app composer require --dev phalcon/devtools

Using version ^4.2 for phalcon/devtools
./composer.json has been updated
Running composer update phalcon/devtools
Loading composer repositories with package information
Updating dependencies
Lock file operations: 22 installs, 0 updates, 0 removals
docker exec -ti phalcon_app ./vendor/bin/phalcon project application simple

Phalcon DevTools (4.2.0)
Success: Controller "index" was successfully created.
Info: /var/www/html/application/app/controllers/IndexController.php
Success: Project 'application' was successfully created.
Info: Please choose a password and username to use Database connection.
Info: Used default: 'root' without password.

Phalcon Framework with Docker