在 Wordpress Docker 容器上未检测到 pdo_mysql 扩展

Pat*_*ros 1 php wordpress pdo docker

我已经使用 Docker 安装了几个 Wordpress 网站,特别是 Evert Ramos 的这个Docker Wordpress Let's Encrypt repo。

虽然它可以轻松快速地部署任意数量的 Wordpress 安装,但仍然存在一些问题和不足,例如sendmail()功能(然后您必须安装SMTP 插件来解决电子邮件发送问题)。

我发现的主要问题是,在安装了这个用于备份 Wordpress 的WPvivid 插件后,我收到以下错误消息:

未检测到 pdo_mysql 扩展。请先安装扩展。

我已经在 google 上搜索了如何pdo_mysql为 Wordpress 容器或在 Nginx 容器内安装扩展。但是,我只找到了有关如何安装它的答案,但用于 PHP 容器。

埃弗特拉莫斯'回购不使用任何PHP的容器,所以我还没有发现如何或在哪里安装pdo_mysql扩展。

这是我docker-compose.yml的 Wordpress 网站之一的文件:

    services:
        db_projects:
          container_name: ${CONTAINER_DB_NAME}
          image: mariadb:10.4
          restart: unless-stopped
          volumes:
            - ${DB_PATH}:/var/lib/mysql
          environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}

        wp_projects:
          depends_on:
            - db_projects
          container_name: ${CONTAINER_WP_NAME}
          image: wordpress:latest
          restart: unless-stopped
          volumes:
            - ${WP_CORE}:/var/www/html
            - ${WP_CONTENT}:/var/www/html/wp-content
            - ./conf.d/php.ini:/usr/local/etc/php/conf.d/php.ini
          environment:
            WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME}:3306
            WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
            WORDPRESS_DB_USER: ${MYSQL_USER}
            WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
            WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX}
            VIRTUAL_HOST: ${DOMAINS}
            LETSENCRYPT_HOST: ${DOMAINS}
            LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}
          logging:
            options:
          max-size: ${LOGGING_OPTIONS_MAX_SIZE:-200k}
    pma_projects:
      image: phpmyadmin/phpmyadmin
      restart: unless-stopped
      container_name: pma_projects
      links:
        - db_projects
      ports:
        - ${PMA_PORT}:80
      environment:
        #MYSQL_USERNAME: root
        #MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
        PMA_HOST: db_projects
        PMA_PORT: 3306
        #PMA_USER: ${MYSQL_USER}
        #PMA_PASSWORD: ${MYSQL_PASSWORD}
        PMA_ARBITRARY: 1
      depends_on:
        - wp_projects
        - db_projects

#   wpcli:
#     image: tatemz/wp-cli
#     volumes:
#       - ${WP_CORE}:/var/www/html
#       - ${WP_CONTENT}:/var/www/html/wp-content
#     depends_on:
#       - db
#     entrypoint: wp

networks:
    default:
       external:
         name: ${NETWORK}
Run Code Online (Sandbox Code Playgroud)

关于如何安装该扩展的任何想法或可以解决这个问题的人?

(我解决这个问题的有用链接:https : //docs.docker.com/samples/library/wordpress/ & https://github.com/docker-library/wordpress/blob/c9f1ca12b6fa8181dee161dfc5ce1692eeaef1d1/php7.2/ apache/Dockerfile | https://github.com/docker-library/wordpress/blob/c9f1ca12b6fa8181dee161dfc5ce1692eeaef1d1/php7.3/fpm/Dockerfile )

按照 Anh Tuan 的回答,我的 dockerfile 如下:

FROM php:7.3-fpm

# install the PHP extensions we need (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions)
RUN set -ex; \
    \
    savedAptMark="$(apt-mark showmanual)"; \
    \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        libjpeg-dev \
        libmagickwand-dev \
        libpng-dev \
        libzip-dev \
    ; \
    \
    docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr; \
    docker-php-ext-install -j "$(nproc)" \
        bcmath \
        exif \
        gd \
        mysqli \
        opcache \
        zip \
                pdo_mysql \
    ; \
    pecl install imagick-3.4.4; \
    docker-php-ext-enable imagick; \
    \
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
    apt-mark auto '.*' > /dev/null; \
    apt-mark manual $savedAptMark; \
    ldd "$(php -r 'echo ini_get("extension_dir");')"/*.so \
        | awk '/=>/ { print $3 }' \
        | sort -u \
        | xargs -r dpkg-query -S \
        | cut -d: -f1 \
        | sort -u \
        | xargs -rt apt-mark manual; \
    \
    apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
    rm -rf /var/lib/apt/lists/*

# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN { \
        echo 'opcache.memory_consumption=128'; \
        echo 'opcache.interned_strings_buffer=8'; \
        echo 'opcache.max_accelerated_files=4000'; \
        echo 'opcache.revalidate_freq=2'; \
        echo 'opcache.fast_shutdown=1'; \
    } > /usr/local/etc/php/conf.d/opcache-recommended.ini
# https://wordpress.org/support/article/editing-wp-config-php/#configure-error-logging
RUN { \
# https://www.php.net/manual/en/errorfunc.constants.php
# https://github.com/docker-library/wordpress/issues/420#issuecomment-517839670
        echo 'error_reporting = E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_RECOVERABLE_ERROR'; \
        echo 'display_errors = Off'; \
        echo 'display_startup_errors = Off'; \
        echo 'log_errors = On'; \
        echo 'error_log = /dev/stderr'; \
        echo 'log_errors_max_len = 1024'; \
        echo 'ignore_repeated_errors = On'; \
        echo 'ignore_repeated_source = Off'; \
        echo 'html_errors = Off'; \
    } > /usr/local/etc/php/conf.d/error-logging.ini

VOLUME /var/www/html

ENV WORDPRESS_VERSION 5.2.2
ENV WORDPRESS_SHA1 3605bcbe9ea48d714efa59b0eb2d251657e7d5b0

RUN set -ex; \
    curl -o wordpress.tar.gz -fSL "https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz"; \
    echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c -; \
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
    tar -xzf wordpress.tar.gz -C /usr/src/; \
    rm wordpress.tar.gz; \
    chown -R www-data:www-data /usr/src/wordpress

COPY docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["php-fpm"]
Run Code Online (Sandbox Code Playgroud)

我只修改了docker-compose.yml用于创建带有mysql_pdo扩展名的 Wordpress 图像的文件:

version: '3'

services:
    db_projects:
      container_name: ${CONTAINER_DB_NAME}
      image: mariadb:10.4
      restart: unless-stopped
      volumes:
        - ${DB_PATH}:/var/lib/mysql
      environment:
        MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
        MYSQL_DATABASE: ${MYSQL_DATABASE}
        MYSQL_USER: ${MYSQL_USER}
        MYSQL_PASSWORD: ${MYSQL_PASSWORD}

    wp_projects:
      depends_on:
        - db_projects
      container_name: ${CONTAINER_WP_NAME}
      #image: wordpress:latest
      build: ./wordpress
        #context: .
        #dockerfile: Custom-Wp-Dockerfile
      restart: unless-stopped
      volumes:
        - ${WP_CORE}:/var/www/html
        - ${WP_CONTENT}:/var/www/html/wp-content
        - ./conf.d/php.ini:/usr/local/etc/php/conf.d/php.ini
      environment:
        WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME}:3306
        WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
        WORDPRESS_DB_USER: ${MYSQL_USER}
        WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
        WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX}
        VIRTUAL_HOST: ${DOMAINS}
        LETSENCRYPT_HOST: ${DOMAINS}
        LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}
      logging:
        options:
          max-size: ${LOGGING_OPTIONS_MAX_SIZE:-200k}
    pma_projects:
      image: phpmyadmin/phpmyadmin
      restart: unless-stopped
      container_name: pma_projects
      links:
        - db_projects
      ports:
        - ${PMA_PORT}:80
      environment:
        #MYSQL_USERNAME: root
        #MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
        PMA_HOST: db_projects
        PMA_PORT: 3306
        #PMA_USER: ${MYSQL_USER}
        #PMA_PASSWORD: ${MYSQL_PASSWORD}
        PMA_ARBITRARY: 1
      depends_on:
        - wp_projects
        - db_projects

#   wpcli:
#     image: tatemz/wp-cli
#     volumes:
#       - ${WP_CORE}:/var/www/html
#       - ${WP_CONTENT}:/var/www/html/wp-content
#     depends_on:
#       - db
#     entrypoint: wp

networks:
    default:
       external:
         name: ${NETWORK}
Run Code Online (Sandbox Code Playgroud)

执行后,docker-compose up -d我收到以下错误:

[pathros@projects wp]$ sudo docker-compose up -d Building wp_projects Step 1/12 : FROM php:7.3-apache 7.3-apache: Pulling from library/php 1ab2bdfe9778: Pulling fs layer 1448c64389e0: Pulling fs layer:62b4a4e层9eb9d1e8e241:等待d20b2d19292c:等待023060ea5930:等待a7fa99bc84ac:等待084397ea0b0b:等待27f2e3242e8a:等待c53d955b925a:等待55a8a68dea39:等待b78786d44570:等待69dd7e866b60:等待2907cf87b0bb:等待错误:服务'wp_projects'未能构建:错误拉动映像配置:GET https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/aa/aa4bdc74350b45a805ad9bdd39ec2cc38cd604a432e447497c3103ad0a8115d8/data?verify=1568225825-5P%2BOlgyxV6p%2FjAXyu%2BTLKCEU5RM%3D:EOF

Arg*_*ong 5

wordpress在此堆栈中使用的映像是 Docker Hub 的默认映像,并且它们有关于如何安装新 PHP 扩展的非常详细的文档。

首先,我们必须对您的docker-compose.yml文件进行一些更改以进行新的wordpress自定义构建:

wordpress:
     depends_on:
       - db
     container_name: ${CONTAINER_WP_NAME}
     # image: wordpress:latest
     build: ./wordpress
Run Code Online (Sandbox Code Playgroud)

其次,在此处创建一个名为 Dockerfile 和 docker-entrypoint.sh 的 WordPress 默认图像的新文件,将其放入wordpress目录中。修改一些魔术代码到wordpress/Dockerfile文件:

RUN docker-php-ext-install pdo pdo_mysql
Run Code Online (Sandbox Code Playgroud)

现在您拥有带有 PDO_MYSQL 扩展的自定义 Docker 堆栈,并且能够运行您的备份过程。

编辑后的堆栈配置:https : //github.com/tdtgit/stackoverflow57447284

如果您需要帮助,请随时发表评论。