php - Docker 连接 nginx/php/mysql 的问题
问题描述
我正在尝试为本地环境的一些 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 设置,但它们是用 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
在启用的扩展列表中
解决方案
我做到了,所以如果在docker文件中我只有RUN docker-php-ext-configure pdo_mysql && docker-php-ext-install mysqli pdo_mysql && docker-php-ext-enable pdo_mysql
它适用于CLI,如果我只有RUN apk add --update php7-pdo_mysql
它适用于fpm而不适用于cli,所以我添加了两者并且它适用于cli和fpm。但这很奇怪,因为我正在使用我已经使用过很多次的锅炉编 docker confids,并且第一次遇到这个问题......