Search code examples
phpmysqldocker-composemariadbfpm

Docker php DPO to MariaDB - Error: Could not find driver


I'm learning PDO now and I found it better to learn it in a LEMP docker stack (Nginx, php-fpm, MariaDB, phpMyadmin) on my Ubuntu 18.04LTS.

This is my php file:

<?php
try {
  $mydb = new PDO('mysql:host=database;dbname=mysql;charset=utf8', 'root', 'admin');
} catch (Exception $e) {
  die('Error : ' . $e->getMessage());
}
?>             

As you can see, I try to make a PDO in my php code to recover some datas from my db. But everytime I got that message on my browser (Firefox 69.0.2): Error : could not find driver

I saw that post here: "Docker can't connect to mariadb with PHP". The problem was quite similar to mine but it didn't work for me.

Note: php-fmp and Nginx work perfeclty together. Same for MariaDB and phpMyAdmin.

Here is my docker-compose.yml file:

version: "3"
services:

  nginx:
    image: tutum/nginx
    ports:
      - "7050:80"
    links:
      - phpfpm
    volumes:
      - ./nginx/default:/etc/nginx/sites-available/default
      - ./nginx/default:/etc/nginx/sites-enabled/default

      - ./logs/nginx-error.log:/var/log/nginx/error.log
      - ./logs/nginx-access.log:/var/log/nginx/access.log

  phpfpm:
    image: php:fpm
    links:
      - database:mysql
    ports:
      - "7051:9000"
    volumes:
      - ./public:/usr/share/nginx/html

  database:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: admin
    ports:
      - "7052:3306"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    links:
      - database:mysql
    ports:
      - "7053:80"
    environment:
      PMA_HOST: mysql
      PMA_USER: root
      PMA_PASSWORD: admin
      PMA_ARBITRARY: 1

If it is possible to solve this without building my own Dockerfiles, it would be great. But if I must, I will. This isn't a problem.


Solution

  • A found the solution.

    First of all, the host must be mysql and not the name of my container (which is database):

    $mydb = new PDO('mysql:host=mysql;dbname=mysql;charset=utf8', 'root', 'admin');
    

    Inside the phpfpm container (accessible via the command docker-compose run --rm <container-name> bash), I had to enable the extension=php_pdo_msql line in my config file php.ini by removing the semicolon at the beginning of its line.

    To avoid doing this manually every time after a docker-compose up, I replaced the phpfpm service in my docker-compose.yml file the following Dockerfile:

    FROM php:fpm
    RUN docker-php-ext-install pdo pdo_mysql
    

    Finally, just build the image with the command docker-compose build . (replace the . by the path to the directory containing the docker-compose.yml file).

    It works perfectly for me.