ntavelis/dockposer

Composer 插件,可自动生成并保持与 composer.json 中声明的 PHP 扩展同步的 Docker 文件。

安装: 159

依赖者: 0

建议者: 0

安全: 0

星级: 12

关注者: 3

分支: 3

开放问题: 1

类型:composer-plugin

v1.1.0 2022-02-21 07:36 UTC

README

CI codecov

Dockposer

Dockposer 是一个 Composer 插件,可以自动生成并保持与 composer.json 中声明的 PHP 扩展同步的 Docker 文件。

此 Composer 插件的目标是保持你在 composer.json 文件的 require 部分中声明的 PHP 扩展/依赖与你的 Docker 文件同步。当你在一个 composer.json 文件中声明一个依赖项,例如 ext-amqp 时,此包将自动生成所需的 Docker 指令来在你的 Docker 镜像中安装 pecl amqp 扩展。此外,此包还将同步所需的 PHP 版本与拉取的官方 Docker 镜像版本。

getcomposer.org 中的引用表明,将系统的依赖项声明在 composer.json 文件中是一种良好的做法

ext- 允许你要求 PHP 扩展(包括核心扩展)。版本可能相当不一致,因此通常最好将约束设置为 *. 扩展包名称的示例是 ext-gd

使用此 composer-plugin,通过在 composer.json 中声明 PHP 扩展,你可以获得额外的好处,即保持所需的扩展与你的 Dockerfile 定义同步。

先决条件

此包将生成 dockerdocker-compose 文件。因此,我假设你已经在系统中安装了它们。请将 Composer 版本 2 及以上安装到你的电脑上。如果你需要 composer 1 支持,请使用此包的版本 0.3.0。

安装

  1. 需要此插件。
    composer require ntavelis/dockposer --dev
  2. 运行 composer install 以触发包运行。
  3. 运行 docker-compose up 以初始化并运行 Docker 容器。
  4. 在浏览器中打开 https:// 以查看应用的首页。

注意:该包会持续检查您的依赖项,如果您使用 vcs(git)注意到任何 Docker 文件已更新,则需要运行 docker-compose up --build 以重建 Docker 镜像。

如何添加 PHP 扩展

为了避免已安装的 PHP 扩展与 composer.lock 中锁定扩展之间的不一致,以下方法被推荐。

假设我们想向我们的系统添加这些依赖项 ext-gmpext-bcmath,推荐的程序是

  1. 将扩展添加到 composer.json 的 require 部分
    "require": {
            "ext-bcmath": "*",
            "ext-gmp": "*",
        }
  2. 运行 docker-compose run --rm php-fpm composer install 以触发包运行,这将生成 Docker 文件内安装 PHP 扩展所需的指令。
  3. 使用 docker-compose down 杀死任何正在运行的容器
  4. 运行 docker-compose up --build 以重建 Docker 镜像,这将构建包含 ext-gmpext-bcmath 的 PHP 镜像。
  5. 运行 docker-compose run --rm php-fpm composer update ext-gmp ext-bcmath 以更新 composer.lock 文件。在这里值得注意的是,我们正在从 php-fpm 容器内部执行 composer update。这被认为是一种良好的做法,因为它避免了在本地系统中由于缺少扩展而导致 composer 错误的问题。

按照上述方法,我们将图片替换为包含我们新必需的php扩展的图片,例如在这个例子中是 ext-gmpext-bcmath 扩展。此外,我们通过在 php-fpm 容器中运行 composer update 命令来更新 composer.lock 文件。

工作原理

该包在 composer 尝试解决您的依赖关系后触发,例如 composer installcomposer update 将触发此包运行。

Dockposer 将读取您的 composer.json 文件中的 require 部分,并生成安装您在 require 部分中声明的 php 扩展的 docker 指令。php 扩展具有 ext 前缀,例如 ext-amqpext-ldap。它还将读取您在 composer.json 的 require 部分中声明的 php 版本,并在 docker 文件中生成 FROM 指令以拉取相同版本的官方 docker 镜像。如果 composer.json 中未声明 php 版本,则默认为执行 composer 的 php 版本。

它不仅生成指令,而且保持同步。任何给定时间,composer.json 的 require 部分都将与 docker 指令保持同步,让您只需思考如何创建您的应用程序。

首次执行

第一次运行此包时,将生成以下文件

您可以修改任何文件,Dockposer 足够智能,能够更新标记区域内的 docker 文件的内容。

依赖关系同步

每次运行 composer installcomposer update 时,Dockposer 都将查看您的 require 部分,并在需要时采取行动以同步 docker 文件。

如果 docker 文件有更新,请记住运行 docker-compose up --build 来重建您的镜像,以便它们包含您所需的依赖关系。

标记区域

如上所述,Dockposer 更新标记区域的内容。一个标记区域以这种类型的注释开始和结束。 ###> %s ###

例如,如果您的 composer.json 文件中声明了依赖项 ext-ldap,Dockposer 将在 ./docker/php-fpm/Dockerfile 中生成此部分

###> ntavelis/dockposer/php-extensions ###
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/bin/
RUN install-php-extensions \
	ldap
###> ntavelis/dockposer/php-extensions ###

随着您在 composer.json 文件中将 php 扩展作为依赖项添加或删除,您将看到此部分会自动更新,以与您的依赖关系同步。当然,Dockposer 不想妨碍您,因此您可以在标记区域之外自由修改 Dockerfile。如果您不希望 Dockposer 维护某个部分,只需将其删除即可,Dockposer 将会识别出来,并且不会维护该区域,这意味着您将失去一些功能。

配置

您可以配置文件名和目录名,目前 Dockposer 支持以下配置。

要更改配置,您需要在 composer.json 中的 extra 键下添加它。示例

...
   "extra": {
        "dockposer": {
            "docker_dir": "docker_rules"
        }
    },
...

注意:更改文件夹或文件名时,所有引用都将使用您指定的名称。

支持扩展列表

在 dockerfile 定义中,我们在 mlocati/docker-php-extension-installer 存储库中使用 shell 脚本。

有关您可以安装的支持 php 扩展的列表,请参阅 此处

如果扩展已预安装在官方 docker 镜像中,并且您在 composer.json 中声明了它,则不会为该库生成任何 docker 指令。

官方 php 镜像中预安装的 php 扩展

  • core
  • ctype
  • curl
  • 日期
  • 文档对象模型(DOM)
  • 文件信息
  • 过滤器
  • FTP
  • 哈希
  • iconv
  • JSON
  • libxml
  • 多字节字符串处理库(mbstring)
  • MySQLnd
  • OpenSSL
  • 正则表达式(PCRE)
  • PHP 数据对象(PDO)
  • PHP 数据对象 SQLite 扩展(pdo_sqlite)
  • PHP 可执行归档(PHAR)
  • POSIX
  • 读取行(readline)
  • 反射
  • 会话(session)
  • 简单的 XML(simplexml)
  • 钠(sodium)
  • 标准 PHP 库(spl)
  • SQLite3
  • 标准
  • 分词器(tokenizer)
  • XML
  • XML 读取器(xmlreader)
  • XML 写入器(xmlwriter)
  • zlib

PHP 框架

Symfony

对于 Symfony,官方的 Docker 镜像已经涵盖了您,您只需要遵循 安装说明

Laravel

对于 Laravel,您需要安装 bcmath 扩展,该扩展在官方 Docker 镜像中未预安装。请检查 Laravel 文档中的要求 在此处

  1. 通过遵循 安装说明 来安装此包。
  2. 将 bcmath 扩展添加到 composer.json 的 require 部分
    "require": {
        "ext-bcmath": "*",
    }
  3. 运行 composer install 以触发插件运行。
  4. 运行 docker-compose up 以初始化容器。

如何使用 xdebug 调试包 - 为贡献此存储库

本节描述了如何设置本地环境以在本包上开发。作为本包的用户,您不需要执行本节中描述的任何操作。

环境设置

  1. 给定以下 phpstorm 配置:[图片链接](https://rawcdn.githack.com/ntavelis/dockposer/HEAD/assets/phpstorm_xdebug_settings.png)

    • 注意:在这里,我们将服务器配置命名为 application,该名称应与调试命令中的 PHP_IDE_CONFIG="serverName=application" 匹配。

    • 注意:取消选中此配置是一个好主意,设置 -> 语言 & 框架 -> 调试 -> 取消选中:在未指定路径映射时强制在第一行断点。

  2. 在与此包相同级别上创建另一个项目。因此,您具有以下目录结构

    /home/antavelis/webprojects/dockposer -> 此处克隆的包

    /home/antavelis/webprojects/demoapp -> 带有 composer.json 文件的 PHP 应用程序

  3. 在 demoapp 位置需要 dockpose 包的本地版本

    {
        "type": "project",
        "license": "proprietary",
        "require": {
            "php": "^7.2.5",
            "ext-ctype": "*",
            "ext-iconv": "*",
            "ntavelis/dockposer": "dev-master"
        },
        "repositories": [
            {
                "type": "path",
                "url": "../dockposer"
            }
        ]
    }
    • 注意:URL 路径必须指向包的位置。Composer 将符号链接包,并将其识别为插件。
  4. 您需要 Docker 和 Docker Compose,请在继续之前安装它们。

执行调试命令

  1. 导航到包的根目录,例如 /home/antavelis/webprojects/dockposer
  2. 导航到 Docker 文件夹:cd ./docker
  3. 在 phpstorm 中设置断点,例如在类 src/DockposerPlugin.php 中的代码中
  4. 执行
    docker-compose run --rm -e PHP_IDE_CONFIG="serverName=application" -e COMPOSER_ALLOW_XDEBUG=true phpserver-dockposer bash -c 'cd /srv/app/demoapp; php -d xdebug.remote_host=172.17.0.1 /usr/local/bin/composer install' 
    • 注意:此环境变量 COMPOSER_ALLOW_XDEBUG=true 指示 composer 不要禁用 xdebug,这样我们就可以调试我们的应用程序。