2016-12-29 94 views
2

所以我試圖建立一個Silex 2應用程序;使用碼頭服務集裝箱作爲ENV控制系統。但是,在訪問資源時,返回是一個PDO異常「找不到驅動程序」。如何通過碼頭集裝箱正確使用Silex 2,Doctrine和PDO?

搬運工-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 

代碼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"] 

服務器邏輯

<?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(); 

的錯誤:

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 

使用MariaDB的數據庫的圖像,檢查的php.ini試過和mysqlnd PDO驅動器被安裝:在_server_容器內

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-米 〜
「的php.ini」[新] 1L ,23C書面

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 

作爲一個方面說明,我想保持server儘可能抽象的服務,因爲服務器可能是任意數量的選項之一(內置,Apache,Nginx等)。

我必須是一些簡單的進出口,但什麼?

回答

3

固定它:

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"] 

注意的RUN docker-php-ext-install pdo pdo_mysql。顯然,在php docker容器中安裝php擴展需要使用隨機提供的內置docker-php-ext-installdocker-php-ext-configure腳本。