En varias ocasiones encontré que para algún proyecto en el que usaba “Reward” como entorno de desarrollo local era necesario agregar paquetes.
Por ejemplo para poder correr magepack es necesario tener todas las librerías de Chromium que no están en la imagen por defecto.
Hasta antes de la versión 0.4.0 de “Reward” era necesario agregarlas ejecutando los comandos en cada ocasión en que lanzábamos el entorno del proyecto.
Para usar magepack (pero también para critical CSS) tenia que ejecutar dentro del contenedor cada vez:
sudo apt-get update
sudo apt-get install -y \
libx11-xcb1 \
libxcomposite-dev \
libxcursor1 \
libxdamage1 \
libxi6 \
libxtst-dev \
libnss3 \
libcups2 \
libxss1 \
libxrandr2 \
libasound2 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libpangocairo-1.0-0 \
libgtk-3-0
Bien, no parece ser nada muy complicado, pero no es lo ideal y es poco deseable si lo que necesitamos es darle a cada desarrollador la posibilidad de montar el entorno local con la menor cantidad de operaciones y conocimientos posible.
A partir de de la versión 0.4.0 (0.4.1 es la versión actual en el momento de escribir este post) hay un mecanismo que nos permite que cada proyecto tenga su propio Dockerfile.
La realidad es que mi escenario es bastante simple pero el potencial de esta nueva funcionalidad permite una flexibilidad muy grande y que solucionaría escenarios mucho mas complejos sin necesidad de crear nuevas imágenes.
No solo el conocimiento y tiempo para crear un Dockerfile es mucho menor que el necesario para crear una imagen sino que la facilidad del mantenimiento y modificación es mucho mas fácil en el caso del Dockerfile.
Bien retomando el ejemplo veamos como se implementa.
Primero creamos un archivo “reward-env.yml” dentro de la carpeta “.reward”
$ mkdir .rewards
$ nano .reward/reward-env.yml
Cuyo contenido será:
version: "3.5"
services:
php-fpm:
build:
context: .
dockerfile: .reward/Dockerfile
Para el próximo paso necesitamos averiguar, si no lo conocemos, cual imagen utiliza nuestro proyecto, lo haremos con el siguiente comando:
$reward env config
Buscamos en la respuesta la linea que corresponde a “php-fpm > image”

Luego creamos, también dentro de “.reward”, el archivo “Dockerfile“
$ nano .reward/Dockerfile
Cuyo contenido será (para el ejemplo propuesto de magepack):
Notese que en “FROM” use el valor obtenido de la “image”
FROM docker.io/rewardenv/php-fpm:8.1-magento2
USER root
RUN apt-get update && apt-get install -y \
libx11-xcb1 \
libxcomposite-dev \
libxcursor1 \
libxdamage1 \
libxi6 \
libxtst-dev \
libnss3 \
libcups2 \
libxss1 \
libxrandr2 \
libasound2 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libpangocairo-1.0-0 \
libgtk-3-0
USER www-data
Cuando tenemos todo listo lanzamos el entorno con el parámetro “–buil”
$ reward env up --build
Veremos como al levantar el entorno se ejecutan los comandos contenidos en el Dockerfile y nuestro entorno queda preparado para usarlos desde el primer momento.
Enlace a la documentación de Reward: https://rewardenv.readthedocs.io/en/latest/customization/additional-packages.html