Sponsored By: Password Angel - Share passwords, API keys, credentials and more with secure, single-use links.

Makefile - Useful Docker / Symfony / PHP commands

When working with a PHP/Symfony project, especially when using docker, it can be a little fiddly and time-consuming to connect to the container and execute the desired command. You can simplify this by creating a Makefile and adding your repetitive commands, including which service to run them against.

Sample Usage

Clear the Symfony cache

make cache-clear

Update the composer vendor packages

make composer-update

Check that the database schema is valid

make validate

Makefile

.PHONY: help
help:
    @echo 'Following targets exist:'
    @echo ''
    @echo '  cache-clear - clear the Symfony cache'
    @echo '  composer-install - install the specified vendor packages'
    @echo '  composer-update - update the vendor packages'
    @echo '  validate - check the entities match the database schema'
    @echo ''

.PHONY: cache-clear
cache-clear:
    docker compose run --rm php bash -c "./bin/console cache:clear"

.PHONY: composer-install
composer-install:
    docker compose run --rm php bash -c "composer install"

.PHONY: composer-update
composer-update:
    docker compose run --rm php bash -c "composer update"

.PHONY: validate
validate:
    docker compose run --rm php bash -c "./bin/console doctrine:schema:validate"

Setup

The above example assumes you are using docker compose and have a compose.yaml file configured with a service called php defined. i.e.

services:
  php:
    image: php:latest

Notes

Tab Indentation

Makefile uses tab indentation instead of spaces. If your Makefile uses spaces you will see an error like

Makefile:9 *** missing separator. Stop.

Also, if you are copying the Makefile from above to base yours from, you must replace the spaces with tabs.

PHP Flags

You can specify PHP flags in your make commands. For example, the PHP image I use for development has XDebug enabled but for some commands it is not relevant for XDebug to be running and you might want to turn it off i.e. so XDebug doesn't block a composer update or Symfony cache clear. You can achieve this by tweaking the Makefile commands above like so

.PHONY: cache-clear
cache-clear:
    docker compose run --rm php bash -c "XDEBUG_MODE=off ./bin/console cache:clear"

.PHONY: composer-install
composer-install:
    docker compose run --rm php bash -c "XDEBUG_MODE=off composer install"

Similarly, if you needed a command to run against a different environment than the default one defined in .env or .env.local then you can do this via something like

.PHONY: cache-clear
cache-clear:
    docker compose run --rm php bash -c "APP_ENV=test ./bin/console cache:clear"

or you can combine them

.PHONY: cache-clear
cache-clear:
    docker compose run --rm php bash -c "XDEBUG_MODE=off APP_ENV=test ./bin/console cache:clear"

Additional Reading