【发布时间】:2019-11-07 13:17:54
【问题描述】:
我正在尝试为本地环境的一些 PHP 项目设置一个 docker。我创建了docker-compose 文件:
############
## This is the LOCAL docker-compose. local is not in the file to make it default,
## easy for development.
############
version: '3.5'
services:
nginx:
build: ./docker/images/nginx
image: project/nginx:latest
ports:
- "80:80"
expose:
- "80"
volumes:
- project_volume:/var/www/vhosts/abboom
networks:
project:
aliases:
- project.local.net
environment:
- VIRTUAL_HOST=project.local.net
php:
build: ./docker/images/php
image: project/php:latest
ports:
- "7778:7778"
expose:
- "9000"
volumes:
- project_volume:/var/www/vhosts/project
networks:
- project
workspace:
build: ./docker/images/workspace
image: project/workspace:latest
volumes:
- project_volume:/var/www/vhosts/project
working_dir: /var/www/vhosts/project
networks:
- project
redis_disk:
build: ./docker/images/redis_disk
image: project/redis:latest
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- project
mysql:
image: project/mysql:latest
build: ./docker/images/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
volumes:
- mysqldata:/var/lib/mysql
networks:
- project
ports:
- "33066:3306"
networks:
project:
name: project
volumes:
mysqldata:
driver: local
redis_data:
driver: local
project_volume:
driver: local
driver_opts:
type: nfs
device: "$PWD/project"
o: bind
也可能我需要为一个项目共享 nginx 虚拟主机(我从暂存服务器中获取了这个虚拟主机配置,可能需要进行更多更改?)
server {
listen 80;
server_name project.local.net;
root /var/www/vhosts/project/public;
index index.php;
access_log /var/log/nginx/host.access.log main;
# redirect server error pages to the static page /50x.html
#
error_page 400 404 500 502 503 504 /500.html;
location = /500.html {
}
location ~ /(assets/|content/|images/|stylesheets/|javascripts/|vendor/|fonts/|favicon.ico) {
root /var/www/vhosts/project/public;
}
location / {
root /var/www/vhosts/project/public;
try_files $uri $uri/ /index.php?$args;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
所以问题是,当我尝试从浏览器访问该站点时,我收到了错误 Uncaught PDOException: could not find a driver in,但是当我从 worksapce 或 php 容器运行迁移时,一切都是工作正常。
我假设由于某种原因nginx 容器未与php 容器链接,并试图在nginx 容器中查找 pdo 驱动程序,而不是在PHP 中查找它?但这听起来也不正确,因为它开始处理 php 脚本并仅在 pdo 上堆叠,因此它连接到 php 容器,所以我不确定在哪里寻找问题
之前我为很多项目做了 docker setup,但是它们是用 PHP 框架编写的,例如 Laravel、Symfony,但是这个是一个手写项目,可能需要一些额外的更改?
更新
这是一个 php Docker 文件:
FROM php:7.1-fpm-alpine
LABEL maintainer="Vincent Composieux <vincent.composieux@gmail.com>"
RUN set -ex \
&& apk --no-cache add \
postgresql-dev
RUN apk add --update \
php7-common \
php7-fpm \
php7-apcu \
php7-ctype \
php7-curl \
php7-dom \
php7-gd \
php7-iconv \
php7-json \
php7-intl \
php7-mcrypt \
php7-mbstring \
php7-opcache \
php7-openssl \
php7-pdo \
php7-pdo_sqlite \
php7-xml \
php7-xmlwriter \
php7-zlib \
php7-phar \
php7-tokenizer \
php7-session \
php7-simplexml \
php7-xdebug \
php7-bcmath\
php7-intl \
php-fileinfo \
php7-redis \
php-gd \
make \
curl \
nano \
g++ \
icu-dev \
libxslt \
libxslt-dev
RUN docker-php-ext-configure pdo_mysql && docker-php-ext-install mysqli pdo_mysql && docker-php-ext-enable pdo_mysql
RUN docker-php-ext-install bcmath
RUN docker-php-ext-configure intl && docker-php-ext-install intl
RUN docker-php-ext-install xsl
RUN rm -rf /var/cache/apk/* && rm -rf /tmp/* && \
curl --insecure https://getcomposer.org/composer.phar -o /usr/bin/composer && chmod +x /usr/bin/composer
ADD php.ini /etc/php7/php-fpm.d/
ADD php.ini /etc/php7/cli/conf.d/
ADD php.ini /etc/php7/cli/conf.d/
ADD xdebug.ini /etc/php7/conf.d/
ADD www.conf /etc/php7/php-fpm.d/
RUN sed -i "s|memory_limit = 128M|memory_limit = 512M |g" /etc/php7/php.ini
RUN sed -i "s|upload_max_file_size = 2M|upload_max_file_size = 1024M |g" /etc/php7/php.ini
RUN sed -i "s|post_max_size = 8M|post_max_size = 1024M |g" /etc/php7/php.ini
RUN sed -i "s|max_execution_time = 30|max_execution_time = 600 |g" /etc/php7/php.ini
CMD ["php-fpm7", "-F"]
WORKDIR /var/www/vhosts/project
EXPOSE 9000
还有php -m 在启用的扩展列表中显示pdo_mysql
【问题讨论】:
-
或者问题是
php-fpm没有看到 pdo 扩展,但 cli 看到了? -
正如我在原始问题中所写的那样。从 CLI 但不是从 fpm 工作,并且数据库迁移脚本和
index.php都使用相同的引导逻辑,我添加了这样的调试var_dump(extension_loaded('pdo_mysql'));die;并在 CLI 中返回true但来自浏览器false。所以看起来因为很痛的原因没有为 fpm 启用扩展 -
另外,我发现 CLI (
php -i | grep php.ini) 使用来自/usr/local/etc/php/php.ini的php.ini文件,但来自/etc/php7/php.ini的 FPM (var_dump(phpinfo());die;),也许就是这样