PHP 扩展对 docker-compose 中的 composer 容器不可用

Posted

技术标签:

【中文标题】PHP 扩展对 docker-compose 中的 composer 容器不可用【英文标题】:PHP extension unavailable to composer container in docker-compose 【发布时间】:2019-03-18 03:29:46 【问题描述】:

我使用 docker-compose,并且在一个项目中拥有多个容器:nginxphp、Composer 和 nginx。一切都很好,除了一件事:作曲家不起作用。我正在尝试安装一个使用 GD 扩展的作曲家项目,该扩展安装在 PHP 中(使用 PHP 容器内的 php -m 确认)。然而,作曲家容器没有“看到”这个扩展并且抱怨它不存在。我如何将这两者联系起来?

docker-compose.yml:

version: '2'
services:
    web:
        image: nginx:1.15.1
        volumes:
            - ./.docker/conf/nginx/default.conf:/etc/nginx/conf.d/default.conf
            - ./html:/var/www/html
        ports:
            - 8888:80
        depends_on:
            - php
            - db
    php:
        build: .docker
        volumes:
            - ./.docker/conf/php/php.ini:/usr/local/etc/php/conf.d/php.ini
            - ./.docker/conf/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
            - ./html:/var/www/html
    composer:
        image: composer
        volumes:
            - ./html:/app
        command: install
        depends_on:
            - php
    db:
        image: postgres:10.4
        environment:
            - POSTGRES_DB=test
            - POSTGRES_USER=test
            - POSTGRES_PASSWORD=test
        ports:
            - 5432:5432
        volumes:
            - ./.docker/conf/postgres/:/docker-entrypoint-initdb.d/

    adminer:
        image: adminer
        ports:
        - 8080:8080

Dockerfile:

FROM php:7.2-fpm

RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
        libicu-dev \
        libpq-dev \
        libxpm-dev \
libvpx-dev \
    && pecl install xdebug \
    && docker-php-ext-enable xdebug \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install -j$(nproc) intl \
    && docker-php-ext-install -j$(nproc) zip \
    && docker-php-ext-install -j$(nproc) pgsql \
    && docker-php-ext-install -j$(nproc) pdo_pgsql \
    && docker-php-ext-install -j$(nproc) exif \
    && docker-php-ext-configure gd \
        --with-freetype-dir=/usr/include/ \
        --with-jpeg-dir=/usr/include/ \
        --with-xpm-dir=/usr/lib/x86_64-linux-gnu/ \
        --with-vpx-dir=/usr/lib/x86_64-linux-gnu/ \

错误:

Starting test_app_db_1      ... done
Starting test_app_php_1     ... done
Starting test_app_adminer_1 ... done
Recreating test_app_composer_1 ... done
Starting test_app_web_1        ... done
Attaching to test_app_adminer_1, test_app_php_1, test_app_db_1, test_app_web_1, test_app_composer_1
php_1       | [12-Oct-2018 21:26:47] NOTICE: fpm is running, pid 1
php_1       | [12-Oct-2018 21:26:47] NOTICE: ready to handle connections
adminer_1   | PHP 7.2.1 Development Server started at Fri Oct 12 21:26:47 2018
db_1        | 2018-10-12 21:26:47.716 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1        | 2018-10-12 21:26:47.716 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1        | 2018-10-12 21:26:47.736 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1        | 2018-10-12 21:26:47.827 UTC [21] LOG:  database system was shut down at 2018-10-12 21:11:42 UTC
db_1        | 2018-10-12 21:26:47.845 UTC [1] LOG:  database system is ready to accept connections
composer_1  | Loading composer repositories with package information
composer_1  | Updating dependencies (including require-dev)
composer_1  | Your requirements could not be resolved to an installable set of packages.
composer_1  | 
composer_1  |   Problem 1
composer_1  |     - gumlet/php-image-resize 1.9.1 requires ext-gd * -> the requested PHP extension gd is missing from your system.
composer_1  |     - gumlet/php-image-resize 1.9.0 requires ext-gd * -> the requested PHP extension gd is missing from your system.
composer_1  |     - Installation request for gumlet/php-image-resize 1.9.* -> satisfiable by gumlet/php-image-resize[1.9.0, 1.9.1].
composer_1  | 
composer_1  |   To enable extensions, verify that they are enabled in your .ini files:
composer_1  |     - 
composer_1  |     - /usr/local/etc/php/conf.d/date_timezone.ini
composer_1  |     - /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
composer_1  |     - /usr/local/etc/php/conf.d/docker-php-ext-zip.ini
composer_1  |     - /usr/local/etc/php/conf.d/memory-limit.ini
composer_1  |   You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
test_app_composer_1 exited with code 2

【问题讨论】:

不要为作曲家使用不同的图像,这看起来像过度工程。在 php 映像中安装 composer。或者对两个容器使用相同的图像 Composer 应该在你的 PHP 容器中。试图将它们分开只会继续痛苦,即使你现在解决它,将来也会有更多的问题。 Composer 不是一直运行的东西,也不应该被视为微服务,而是作为 PHP 微服务的依赖项。 【参考方案1】:

您正在将模块安装在 php 服务中,而不是在 composer 服务中。

composer 运行时,其容器中的 php 安装并没有安装这些模块。

你可以在你的 php 容器中安装 composer,然后从那里运行它。

你可以通过简单地添加:

# latest composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

在您的 php dockerfile 中,就在您的 RUN 行之后。

这将要求您完全删除您的作曲家容器,并直接在 PHP 容器中运行作曲家。

您也可以简单地运行 composer 并告诉它不要检查平台要求:

docker run --rm --interactive --tty \
    --volume $PWD:/var/www/html \
    composer install --ignore-platform-reqs 

或者如果你有一个单独的作曲家容器,出于某种原因:

docker-compose run composer install --ignore-platform-reqs

【讨论】:

【参考方案2】:

或者,您可以将--ignore-platform-reqs--no-scripts 标志传递给installupdate(如here 所述)。

docker run --rm --interactive --tty \
    --volume $PWD:/app \
    composer install --ignore-platform-reqs --no-scripts

但我总是更喜欢在我的 php 容器中安装 composer。

【讨论】:

【参考方案3】:

更好的选择是使用platform 设置指定环境依赖项。发现于:https://***.com/a/55431247/2254615

"config": 
"platform": 
    "php": "7.2.14",
    "ext-fileinfo": "1.0.5",
    "ext-pdo": "7.2.14",
    "ext-session": "7.2.14",
    "ext-iconv": "7.2.14",
    "ext-zip": "1.15.4"

【讨论】:

对我不起作用,尽管 docker Composer 文档也建议这样做

以上是关于PHP 扩展对 docker-compose 中的 composer 容器不可用的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 中的“无法连接到本地 MySQL 服务器”

什么是 PHP 中的用户级缓存 APCu 扩展?

docker-compose编排启动LNMP

php中的钩子(hook插件机制)

在 docker-compose、nginx、mysql 和 php 上运行 wordpress

PHP的DBA扩展学习