Running the Laravel Scheduler and Queue with Docker
Running the Laravel Scheduler and Queue with Docker
Running the Laravel Scheduler and Queue with Docker

Running the Laravel Scheduler and Queue with Docker

Image for post
Image for post

Orignial from https://github.com/do-community/travellist-laravel-demo

#!/usr/bin/env bash
set -e

role=${CONTAINER_ROLE:-app}
env=${APP_ENV:-production}

if [ "$env" != "local" ]; then
echo "Caching configuration..."
(cd /var/www/html && php artisan config:cache && php artisan route:cache && php artisan view:cache)
fi

if [ "$role" = "app" ]; then
exec php-fpm
elif [ "$role" = "scheduler" ]; then
echo "Queue role"
while [ true ]
do
php /var/www/artisan schedule:run --verbose --no-interaction &
sleep 60
done
elif [ "$role" = "queue" ]; then
echo "Running the queue..."
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
else
echo "Could not match the container role \"$role\""
exit 1
fi
FROM php:7.4-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
supervisor

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# setup redis
RUN pecl install redis \
&& docker-php-ext-enable redis

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer


# Create system user to run Composer and Artisan Commands
# RUN useradd -G www-data,root -u $uid -d /home/$user $user
# RUN mkdir -p /home/$user/.composer && \
# chown -R $user:$user /home/$user && \
# chown -R $user:$user /var/www/


# Set working directory
WORKDIR /var/www
ADD composer.json ./
RUN composer install --prefer-dist --no-scripts --no-autoloader --no-interaction --no-ansi --optimize-autoloader

COPY . /var/www/
VOLUME /var/www/storage /var/www/bootstrap
# Create system user to run Composer and Artisan Commands


COPY docker/start.sh /usr/local/bin/start
RUN chown -R $user: /var/www \
&& chmod u+x /usr/local/bin/start
COPY docker/supervisord.conf /etc/supervisor/supervisord.conf

# USER $user
CMD ["/usr/local/bin/start"]
  • The file will configure Nginx to listen on port 80 and use index.php as default index page. It will set the document root to /var/www/public, and then configure Nginx to use the app service on port 9000 to process *.php files.
$ cat docker-compose/nginx/travellist.conf
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
$ cat docker-compose/mysql/init_db.sql 
DROP TABLE IF EXISTS `places`;

CREATE TABLE `places` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`visited` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `places` (name, visited) VALUES ('Berlin',0),('Budapest',0),('Cincinnati',1),('Denver',0),('Helsinki',0),('Lisbon',0),('Moscow',1),('Nairobi',0),('Oslo',1),('Rio',0),('Tokyo',0);
cd travellist-laravel-demo-tutorial-4.0.1
cp .env.example .env
  • Modify .env to correct information
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=user
DB_PASSWORD=password
  • Web server exec php-fpm
  • Scheduler runner php /var/www/artisan schedule:run
  • Queue worker /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
version: "3.7"
services:
app:
build:
args:
user: www-data
uid: 1000
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
- composer_cache:/home/.sammy/.composer
networks:
- travellist
environment:
APP_ENV: local
CONTAINER_ROLE: app

scheduler:
image: travellist
container_name: travellist-scheduler
depends_on:
- app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
- composer_cache:/home/.sammy/.composer
networks:
- travellist
environment:
APP_ENV: local
CONTAINER_ROLE: scheduler

queue:
image: travellist
container_name: travellist-queue
depends_on:
- app
volumes:
- ./:/var/www
- composer_cache:/home/.sammy/.composer
environment:
APP_ENV: local
CONTAINER_ROLE: queue
CACHE_DRIVER: redis
SESSION_DRIVER: redis
QUEUE_DRIVER: redis
REDIS_HOST: redis

redis:
container_name: travellist-redis
image: redis:4-alpine
ports:
- 16379:6379

db:
image: mysql:5.7
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: travellist
MYSQL_ROOT_PASSWORD: password
MYSQL_PASSWORD: password
MYSQL_USER: user
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
- travellist

nginx:
image: nginx:alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
- "8000:80"
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d
networks:
- travellist

networks:
travellist:
driver: bridge
volumes:
composer_cache:
$ chmod -R 777 storage .env

$ docker-compose up -d

$ docker-compose exec app ls -l
total 256
-rw-rw-r-- 1 1000 1000 737 May 14 2020 Dockerfile
drwxrwxr-x 6 1000 1000 4096 May 14 2020 app
-rwxr-xr-x 1 1000 1000 1686 May 14 2020 artisan
drwxr-xr-x 2 root root 4096 Dec 25 08:47 bootstrap
-rw-rw-r-- 1 1000 1000 1501 May 14 2020 composer.json
-rw-rw-r-- 1 1000 1000 181665 May 14 2020 composer.lock
drwxrwxr-x 2 1000 1000 4096 May 14 2020 config
drwxrwxr-x 5 1000 1000 4096 May 14 2020 database
drwxrwxr-x 4 1000 1000 4096 May 14 2020 docker-compose
-rw-rw-r-- 1 1000 1000 1016 May 14 2020 docker-compose.yml
-rw-rw-r-- 1 1000 1000 1013 May 14 2020 package.json
-rw-rw-r-- 1 1000 1000 1405 May 14 2020 phpunit.xml
drwxrwxr-x 5 1000 1000 4096 May 14 2020 public
-rw-rw-r-- 1 1000 1000 814 May 14 2020 readme.md
drwxrwxr-x 6 1000 1000 4096 May 14 2020 resources
drwxrwxr-x 2 1000 1000 4096 May 14 2020 routes
-rw-rw-r-- 1 1000 1000 563 May 14 2020 server.php
drwxr-xr-x 2 root root 4096 Dec 25 08:47 storage
drwxrwxr-x 4 1000 1000 4096 May 14 2020 tests
-rw-rw-r-- 1 1000 1000 538 May 14 2020 webpack.mix.js

$ docker-compose exec app composer install
Alt Text
Alt Text
Alt Text

Written by

Awesome Devops || CloudOpz

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store