Search code examples
dockerpdodoctrine-ormsilexdbal

How do I properly use Silex 2, Doctrine, and PDO via docker containers?


So I am attempting to build a Silex 2 application; using docker service containerization as the ENV control system. However, when accessing the resource the return is a PDO Exception 'driver not found'.

docker-compose.yml

# program code
code:
  build: docker/code
#  env_file: .env
  ports:
    - "80:8080"
volumes:
  - ./code:/code

# database
db:
  image: mysql:latest
  volumes:
    - /var/lib/mysql
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: app_db
    MYSQL_USER: app_db_user
    MYSQL_PASSWORD: app_db_pass

code Dockerfile

FROM php:7

WORKDIR /code

# install curl and php
RUN apt-get update -y
RUN apt-get install git zip -y

# install composer & app deps; then remove
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer

EXPOSE 80
CMD ["php", "-S", "0.0.0.0:80"]

server logic

<?php
# silex micro framework basic entry script

// web/index.php
require_once __DIR__.'/vendor/autoload.php';
require_once __DIR__.'/common/env.php';

$app = new Silex\Application();
$app['debug'] = true;

$app->register(new Silex\Provider\DoctrineServiceProvider(), [
    'db.options' => [
        'driver' => 'pdo_mysql',
        'dbname' => 'app_db',
        'host' => '172.17.0.2',
        'user' => 'app_db_user',
        'password' => 'app_db_pass',
        'charset' => 'utf8mb4',
        'port' => '3306',
    ]
]);

$app->get('/', function () use ($app) {
    $sql = 'SELECT * FROM test WHERE id = 1';
    $data = $app['db']->fetchAssoc($sql);
    return  json_encode($data);
});

$app->run();

The Error:

Whoops, looks like something went wrong.
3/3
DriverException in AbstractMySQLDriver.php line 115:
An exception occured in driver: could not find driver
2/3
PDOException in PDOConnection.php line 47:
could not find driver
1/3
PDOException in PDOConnection.php line 43:
could not find driver

Tried using mariaDB database image, check php.ini and the mysqlnd PDO driver is installed:

mysqlnd

mysqlnd enabled
Version mysqlnd 5.0.12-dev - 20150407 - $Id: d8daadaf41e3cd81d7c6ae96c6091fd15b2c9382 $
Compression supported
core SSL    supported
extended SSL    supported
Command buffer size 4096
Read buffer size    32768
Read timeout    31536000
Collecting statistics   Yes
Collecting memory statistics    No
Tracing n/a
Loaded plugins  mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_sha256_password
API Extensions  no value

php-m inside of the _server_ container ~
"php.ini" [New] 1L, 23C written

php -m

[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

As a side note I'd like to keep the server service as abstracted as possible as the server may be one of any number of options (built in, apache, nginx, etc).

I has to be something simple Im over looking, but what?


Solution

  • Fixed it:

    FROM php:latest
    
    # install curl and php
    RUN apt-get update -y
    RUN apt-get install curl git zip -y
    
    # call PHP images script `docker-php-ext-install` and install language extensions
    RUN docker-php-ext-install pdo pdo_mysql
    
    # install composer & app deps; then remove
    RUN curl -sS https://getcomposer.org/installer | php
    RUN mv composer.phar /usr/local/bin/composer
    
    # change working dir
    WORKDIR /code
    
    CMD ["php", "-S", "0.0.0.0:80"]
    

    Noticed RUN docker-php-ext-install pdo pdo_mysql. Apparently installing php extensions in the php docker container requires using the built in docker-php-ext-install and docker-php-ext-configure scripts that are provided with the machine.