laravel as a docker-compose service - [QueryException] could not find driver - laravel

I create a container for my laravel project using this dockerfile:
FROM composer:1.8
RUN apk add --no-cache libpng libpng-dev libjpeg-turbo-dev libwebp-dev zlib-dev libxpm-dev
RUN docker-php-ext-install pdo mbstring gd
RUN docker-php-ext-enable gd
WORKDIR /app
COPY . /app
RUN composer install
CMD php artisan serve --host=0.0.0.0 --port=8181
EXPOSE 8181
then I try to use it as a service inside a docker-compose.yml file:
version: '3'
services:
webservice:
image: private.repo.com/my_user/webservice
ports:
- '80:8181'
depends_on:
- mariadb
mariadb:
image: mariadb
volumes:
- './db:/var/lib/mysql'
environment:
- MYSQL_ROOT_PASSWORD=some_password
phpmyadmin:
image: phpmyadmin/phpmyadmin
depends_on:
- mariadb
ports:
- '443:80'
environment:
- PMA_HOST=mariadb
- PMA_PORT=3306
now I am getting error 500 when I want to call my APIs.
(error is [QueryException] could not find driver)
I searched about it and all I found is that it usually about happens because there is something wrong with .env file
this is my .env file in laravel project
DB_CONNECTION=mysql
DB_HOST=mariadb
DB_PORT=3306
DB_DATABASE=my_db_name
DB_USERNAME=my_db_user
DB_PASSWORD=my_db_pass
the DB_HOST is the same as my docker-compose.yml file.
I also tried to exporting port 3306 in my mariadb service but it didn't work either
where did I go wrong, pls help
-----------update-----------
I also checked the ip of mariadb service and put it on my service container (while they both working, without shutting them down) but the problem remains.

it was actually pretty simple.
I had to installed pdo_mysql too
now my docker file is like this:
FROM composer:1.8
RUN apk add --no-cache libpng libpng-dev libjpeg-turbo-dev libwebp-dev zlib-dev libxpm-dev
RUN docker-php-ext-install pdo mbstring gd pdo_mysql # this line is changed
RUN docker-php-ext-enable gd
WORKDIR /app
COPY . /app
RUN composer install
CMD php artisan serve --host=0.0.0.0 --port=8181
EXPOSE 8181
I found the solution here: https://github.com/docker-library/php/issues/62#issuecomment-70306737

Related

Commands in Dockerfile has no effect in container (Docker)

I am deploying dockerized application to digitalocean server. (Ubuntu 22.04)
But I don't want to pass vendor directory there. To create it in remote server I am trying to use composer update method in my application's container.
docker-compose.yml:
version: "3.9"
services:
#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
- ./:/var/www
networks:
- app-network
#Nginx Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network
#Docker Networks
networks:
app-network:
driver: bridge
Dockerfile:
FROM php:8.1-fpm as php
USER root
WORKDIR /var/www
# Install PHP packages
RUN apt-get update && apt-get install -y \
git \
curl \
libreoffice \
build-essential \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
libonig-dev \
libzip-dev
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install mbstring zip exif pcntl
RUN docker-php-ext-configure gd --enable-gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/
RUN docker-php-ext-install gd
# Copy existing application directory contents
COPY . /var/www
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer update
RUN composer dump-autoload
RUN chmod -R 755 storage/
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
When I run docker build and up commands everything working fine without any error. But my application throws an error because it can't find vendor directory in application.
As you see in Dockerfile I am running composer update command. It is working while building and gives me some logs:
But when I log in my container with docker exec -it app /bin/bash command, I can't see any vendor directory created in /var/www. I am able to run composer update in container manually and it is not giving any error.
Main problem is why composer update is not creating vendor directory while givings logs. Even RUN chmod -R 755 storage/ command is not giving defined permissions to folder. I feel like Dockerfile has no effect on my container except installing packages and extensions.

Laravel projet from git inside docker container

I've been trying to create a docker compose and docker file for my laravel project. The closes one I get is
Could not open input file: artisan
This is my docker-compose.yml:
version: "3"
services:
webserver:
hostname: webserver
container_name: webserver
image: php:8
restart: always
build:
context: ./webserver
volumes:
- /home/dockerized/laravel-exp/:/app
ports:
- 21280:8000
networks:
- dev_networks
depends_on:
- phpmyadmin
db:
#other service base in mariadb.
phpmyadmin:
#could use adminer.
networks:
dev_networks:
name: dev_networks
With dockerfile as such:
FROM php:8
RUN apt-get update -y && apt-get install -y openssl zip unzip git apt-utils libonig-dev
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN docker-php-ext-install pdo mbstring
WORKDIR /app
COPY . /app
RUN rm -rf /app/*
RUN git clone https://github.com/.../myFproject.git /app && chmod +x /app/artisan
WORKDIR /app
RUN composer install
WORKDIR /app
CMD php artisan serve --host=0.0.0.0 --port=8000
EXPOSE 8000
I've using bitnami image but still no avail.

How to run laravel job queue in php-fpm image on docker

I have a container with a nginx, mailhog, redis and PHP image. All these images are on the same network.
I run Laravel on the PHP image.
I want to make use of the Job queue that laravel has, but I am struggling to run the queue in the PHP image.
I've looked at all the examples but it seems my lack of understanding of docker is causing me to not ask the right question
Below is my docker-compose.yml
version: '3'
networks:
devnet:
external: true
services:
# lightweight web-server:
nginx:
image: nginx:stable-alpine
container_name: lar-nginx
ports:
- 8080:80
- 4040:443
volumes:
- ./:/var/www
- ./run/nginx:/etc/nginx/conf.d
- ./local/certs:/etc/nginx/certs
depends_on:
- php
networks:
- devnet
# server-side scripting engine
php:
build:
context: .
dockerfile: Dockerfile
container_name: lar-php
volumes:
- ./:/var/www
ports:
- "9000:9000"
networks:
- devnet
# caching server:
redis:
image: redis:latest
container_name: lar-redis
ports:
- "6379:6379"
networks:
- devnet
# development email catch-all server & client:
mailhog:
image: mailhog/mailhog:latest
container_name: lar-mailhog
ports:
# imap port for send mail
- "1025:1025"
# www mailhog ui
- "8025:8025"
networks:
- devnet
Dockerfile
FROM php:7.4-fpm
RUN apt-get update
RUN apt-get -y install curl gnupg cron
# RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
# RUN apt-get -y install nodejs
# RUN npm install
# Install other required PHP extensions and unix utils:
RUN apt-get update && apt-get install -y libmcrypt-dev \
mariadb-client libmagickwand-dev libonig-dev \
libzip-dev libcurl4-openssl-dev redis-server \
zlib1g-dev wget git \
--no-install-recommends \
# && pecl install imagick
# && docker-php-ext-enable imagick
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install mbstring \
&& docker-php-ext-install zip \
&& docker-php-ext-install xml \
&& docker-php-ext-install curl \
&& docker-php-ext-install gd \
&& docker-php-ext-install soap
# Configure PHP internal vars:
ENV PHP_MEMORY_LIMIT=256M
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Install php apcu pecl package:
RUN pecl install apcu && docker-php-ext-enable apcu
# Install php redis pecl package:
RUN pecl install redis && docker-php-ext-enable redis
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl
# Permissions for Laravel
RUN chown -R www-data:www-data /var/www
RUN chmod -R 777 /var/www
COPY entrypoint.bash /usr/sbin
RUN chmod a+x /usr/sbin/entrypoint.bash
ENTRYPOINT /usr/sbin/entrypoint.bash
entrypoint.bash
#!/bin/bash
# turn on bash's job control
set -m
# Start the "main" PHP process and put it in the background
php-fpm &
# Start the helper crond process
crond
# now we bring the primary process back into the foreground
fg %1
In normal server(lamp) environment its pretty simple to work with cronjobs and queue but I dont know how to start up the queue.
php artisan queue:work in the php image returs There are no commands defined in the "queue:" namespace. Did you mean this? queue
Running it in tinker
\Queue::pushON('new', new App\Jobs\PublishingClass(array('foo'=>1,'foobar'=>783,'foobarfoo'=>33)));
show the job gets processed but I need to do it with a process running in the background
The most simple way is to call with the use of Tinker
It's Laravel command using for debugging, use it by running below command from from project root
php artisan tinker
To dispatch job on a specific queue from tinker
\Queue::pushON('rms', new App\Jobs\UpdateRMS());
first parameter - Queue name
second parameter - job name
Dispatch multiple jobs at once to a specific queue
\Queue::bulk([new App\Jobs\UpdateRMS(), new App\Jobs\UpdateRMS()], null, 'rms');
You can use this docker image, you don't need to configure the schedule, it's already implemented, with differents php expansions like redis, Rdkafka.
Follow this link:
https://hub.docker.com/r/jkaninda/laravel-php-fpm
https://github.com/jkaninda/laravel-php-fpm

How do I install composer in container of docker?

I am new at docker and docker-compose and I am developing a Laravel-project on docker and docker-compose with Laradock as following a tutorial(not sure whether It is a correct way or not to refer this situation though).
I want to install the composer in this environment to be able to use the composer command.
As a matter of fact, I wanted to do seeding to put data into DB that I made by php artisan make:migrate but this error appeared.
include(/var/www/laravel_practice/vendor/composer/../../database/seeds/AdminsTableSeeder.php): failed to open stream: No such file or directory
So I googled this script to find a solution that will solve the error then I found it.
It says, "Do composer dump-autoload and try seeding again", so I followed it then this error appeared.
bash: composer: command not found
Because I have not installed composer into docker-container.
My docker's condition is like this now.
・workspace
・mysql
・apache
・php-fpm
Since I have not installed the composer, I have to install it into docker-container to solve the problem, BUT I have no idea how to install it into docker-container.
So could anyone tell me how to install composer into docker-container?
Thank you.
here is the laradock/mysql/Dockerfile and laravelProject/docker-compose.yml.
ARG MYSQL_VERSION=5.7
FROM mysql:${MYSQL_VERSION}
LABEL maintainer="Mahmoud Zalt <mahmoud#zalt.me>"
#####################################
# Set Timezone
#####################################
ARG TZ=UTC
ENV TZ ${TZ}
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && chown -R mysql:root /var/lib/mysql/
COPY my.cnf /etc/mysql/conf.d/my.cnf
CMD ["mysqld"]
EXPOSE 3306
version: '2'
services:
db:
image: mysql:5.7
ports:
- "6603:3306"
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=true
- MYSQL_DATABASE=laravelProject
- LANG=C.UTF-8
volumes:
- db:/var/lib/mysql
command: mysqld --sql-mode=NO_ENGINE_SUBSTITUTION --character-set-server=utf8 --collation-server=utf8_unicode_ci
web:
image: arbiedev/php-nginx:7.1.8
ports:
- "8080:80"
volumes:
- ./www:/var/www
- ./nginx.conf:/etc/nginx/sites-enabled/default
volumes:
db:
You can build your own image and use it in your Docker compose file.
FROM php:7.2-alpine3.8
RUN apk update
RUN apk add bash
RUN apk add curl
# INSTALL COMPOSER
RUN curl -s https://getcomposer.org/installer | php
RUN alias composer='php composer.phar'
# INSTALL NGINX
RUN apk add nginx
I used the PHP alpine image as my base image because it's lightweight, so you might have to install other dependencies yourself. In your docker-compose file
web:
build: path/to/your/Dockerfile/directory
image: your-image-tag
ports:
- "8080:80"
volumes:
- ./www:/var/www
- ./nginx.conf:/etc/nginx/sites-enabled/default
You could do something like this:
FROM php:8.0.2-apache
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y mariadb-client libxml2-dev
RUN apt-get autoremove -y && apt-get autoclean
RUN docker-php-ext-install mysqli pdo pdo_mysql xml
COPY --from=composer /usr/bin/composer /usr/bin/composer
the argument COPY --from= should solve your problem.
FROM php:7.3-fpm-alpine
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer
RUN apk update
RUN apk upgrade
RUN apk add bash
RUN alias composer='php /usr/bin/composer'

How to fix 'SQLSTATE[HY000] [2002] Connection refused' error in laravel (artisan migrate in docker)

When I try to add a command php artisan migrate to the docker file, an error occurs:
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = vacancylist and table_name = migrations)
Dockerfile
FROM php:7.2.10-fpm
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
RUN apt-get update -y && apt-get install -y \
build-essential \
mysql-client \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
curl
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
WORKDIR /app
COPY . /app
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install
RUN php artisan migrate
CMD php artisan serve --host=0.0.0.0 --port=80
docker-compose.yml
version: '2'
services:
app:
build: .
ports:
- "8000:80"
volumes:
- .:/app
env_file: .env
working_dir: /app
# command: bash -c 'php artisan migrate && php artisan serve --host 0.0.0.0'
depends_on:
- db
links:
- db
db:
image: "mysql:5.7.25"
environment:
- MYSQL_ROOT_PASSWORD=newrootpassword
- MYSQL_DATABASE=vacancylist
- MYSQL_USER=root
- MYSQL_PASSWORD=newrootpassword
- MYSQL_ALLOW_EMPTY_PASSWORD=true
volumes:
- ./data/:/var/lib/mysql
ports:
- "3306:3306"
.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=vacancylist
DB_USERNAME=root
DB_PASSWORD=newrootpassword
All you configuration looks correct. One thing I would fix is remove links section - it is obsolete and not recommended for use anymore.
I would suggest that database simply takes more time for startup comparing to php and that is your problem. depends_on section doesnt solve this issue - it only controls the startup order. Try adding a little pause in php or use wait-for-it toolkit - it is specially designed for such cases: it waits until host/port become available.

Resources