【问题标题】:Docker problem to connect nginx/php/mysqlDocker 连接 nginx/php/mysql 的问题
【发布时间】: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,但是当我从 worksapcephp 容器运行迁移时,一切都是工作正常。

我假设由于某种原因nginx 容器未与php 容器链接,并试图在nginx 容器中查找 pdo 驱动程序,而不是在PHP 中查找它?但这听起来也不正确,因为它开始处理 php 脚本并仅在 pdo 上堆叠,因此它连接到 php 容器,所以我不确定在哪里寻找问题

之前我为很多项目做了 docker setup,但是它们是用 PHP 框架编写的,例如 LaravelSymfony,但是这个是一个手写项目,可能需要一些额外的更改?

更新

这是一个 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.iniphp.ini 文件,但来自 /etc/php7/php.ini 的 FPM (var_dump(phpinfo());die;),也许就是这样

标签: php mysql docker nginx


【解决方案1】:

我做到了,所以如果在 docker 文件中我只有 RUN docker-php-ext-configure pdo_mysql &amp;&amp; docker-php-ext-install mysqli pdo_mysql &amp;&amp; docker-php-ext-enable pdo_mysql 它适用于 CLI,如果我只有 RUN apk add --update php7-pdo_mysql 它适用于 fpm 但不适用于 cli,所以我添加了两者,它适用于 cli 和每分钟。但这很奇怪,因为我正在使用我已经使用过很多次的锅炉编 docker confids,并且第一次遇到这个问题......

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 2020-11-20
    • 2019-05-24
    • 2020-04-17
    • 1970-01-01
    • 2021-04-22
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多