<!-- TITLE: Php Laravel App Dockerfile -->
<!-- SUBTITLE: A quick summary of Php Laravel App Dockerfile -->
# Dockerfile for php Larael application
This is the base Dockerfile can be used to serve Laravel or similar php application. Based on Debian. Average size may vary.
## Dockerfile
```dockerfile
FROM php:7.2-fpm
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
default-mysql-client \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
jpegoptim optipng pngquant gifsicle \
curl \
nginx \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer
# Copy composer.lock and composer.json
COPY ./config/app.conf /etc/nginx/sites-available/default
COPY ./config/local.ini /usr/local/etc/php/conf.d/local.ini
COPY composer.lock composer.json /var/www/
COPY --chown=www-data:www-data . /var/www
RUN composer install
#Create folder for cache if file cache is used in .env file
RUN mkdir ./storage/framework/views && chown -R www-data:www-data /var/www/
# Database migrations and seeds, at this moment migrations doesn't work, must be added in entrypoint.sh
# RUN php artisan migrate && php artisan db:seed
# Expose port 9000 and start php-fpm server
EXPOSE 80
#CMD ["exec nginx -g 'daemon off;' && php-fpm"]
CMD ["sh", "-c", "nginx; php-fpm"]
```
## Docker-compose file
```yaml
version: '3'
services:
mysql:
image: mysql:5.7
container_name: ${PROJECT_NAME}_mysql
restart: unless-stopped
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
volumes:
- ms_data:/var/lib/mysql
networks:
project:
aliases:
- mysql
php:
build:
context: .
image: ${PROJECT_HUB}/php:${IMAGE_TAG}
container_name: ${PROJECT_NAME}_php
restart: unless-stopped
tty: true
env_file:
- ./.env
environment:
- DB_CONNECTION=mysql
- DB_HOST=${MYSQL_DB_HOST}
- DB_DATABASE=${MYSQL_DATABASE}
- DB_USERNAME=${MYSQL_USER}
- DB_PASSWORD=${MYSQL_PASSWORD}
working_dir: /var/www
ports:
- "8888:80"
networks:
project:
aliases:
- php
redis:
image: redis:alpine
container_name: ${PROJECT_NAME}_redis
restart: on-failure
networks:
project:
aliases:
- redis
volumes:
ms_data:
networks:
project:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.10.21.0/24
```
## Environment sample file
```bash
IMAGE_TAG=latest
PROJECT_HUB=harbor/sample
PROJECT_NAME=sample
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:somebase64string
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost
MYSQL_DB_HOST=mysql
MYSQL_ROOT_PASSWORD=secretp@sswd
MYSQL_DATABASE=dbname
MYSQL_USER=dbuser
MYSQL_PASSWORD=secret1
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mail.host
MAIL_PORT=587
MAIL_USERNAME=user@mail.host
MAIL_PASSWORD=PASSWORD
MAIL_ENCRYPTION=null
```