ntavelis / dockposer
Composer 插件,可自动生成并保持与 composer.json 中声明的 PHP 扩展同步的 Docker 文件。
Requires
- php: >=7.4
- composer-plugin-api: ^2.0
Requires (Dev)
- composer/composer: ^2.0.0
- phpstan/phpstan: ^0.12.19
- phpunit/phpunit: ^8.0
- squizlabs/php_codesniffer: ^3.5
README
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 定义同步。
先决条件
此包将生成 docker
和 docker-compose
文件。因此,我假设你已经在系统中安装了它们。请将 Composer 版本 2 及以上安装到你的电脑上。如果你需要 composer 1 支持,请使用此包的版本 0.3.0。
安装
- 需要此插件。
composer require ntavelis/dockposer --dev
- 运行
composer install
以触发包运行。 - 运行
docker-compose up
以初始化并运行 Docker 容器。 - 在浏览器中打开
https://
以查看应用的首页。
注意:该包会持续检查您的依赖项,如果您使用 vcs(git)注意到任何 Docker 文件已更新,则需要运行 docker-compose up --build
以重建 Docker 镜像。
如何添加 PHP 扩展
为了避免已安装的 PHP 扩展与 composer.lock 中锁定扩展之间的不一致,以下方法被推荐。
假设我们想向我们的系统添加这些依赖项 ext-gmp
和 ext-bcmath
,推荐的程序是
- 将扩展添加到 composer.json 的
require
部分"require": { "ext-bcmath": "*", "ext-gmp": "*", }
- 运行
docker-compose run --rm php-fpm composer install
以触发包运行,这将生成 Docker 文件内安装 PHP 扩展所需的指令。 - 使用
docker-compose down
杀死任何正在运行的容器 - 运行
docker-compose up --build
以重建 Docker 镜像,这将构建包含ext-gmp
、ext-bcmath
的 PHP 镜像。 - 运行
docker-compose run --rm php-fpm composer update ext-gmp ext-bcmath
以更新 composer.lock 文件。在这里值得注意的是,我们正在从 php-fpm 容器内部执行 composer update。这被认为是一种良好的做法,因为它避免了在本地系统中由于缺少扩展而导致 composer 错误的问题。
按照上述方法,我们将图片替换为包含我们新必需的php扩展的图片,例如在这个例子中是 ext-gmp
和 ext-bcmath
扩展。此外,我们通过在 php-fpm 容器中运行 composer update 命令来更新 composer.lock 文件。
工作原理
该包在 composer 尝试解决您的依赖关系后触发,例如 composer install
或 composer update
将触发此包运行。
Dockposer 将读取您的 composer.json 文件中的 require
部分,并生成安装您在 require
部分中声明的 php 扩展的 docker 指令。php 扩展具有 ext
前缀,例如 ext-amqp
,ext-ldap
。它还将读取您在 composer.json 的 require
部分中声明的 php 版本,并在 docker 文件中生成 FROM 指令以拉取相同版本的官方 docker 镜像。如果 composer.json 中未声明 php 版本,则默认为执行 composer 的 php 版本。
它不仅生成指令,而且保持同步。任何给定时间,composer.json 的 require 部分都将与 docker 指令保持同步,让您只需思考如何创建您的应用程序。
首次执行
第一次运行此包时,将生成以下文件
您可以修改任何文件,Dockposer 足够智能,能够更新标记区域内的 docker 文件的内容。
依赖关系同步
每次运行 composer install
或 composer 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 文档中的要求 在此处。
- 通过遵循 安装说明 来安装此包。
- 将 bcmath 扩展添加到 composer.json 的
require
部分"require": { "ext-bcmath": "*", }
- 运行
composer install
以触发插件运行。 - 运行
docker-compose up
以初始化容器。
如何使用 xdebug 调试包 - 为贡献此存储库
本节描述了如何设置本地环境以在本包上开发。作为本包的用户,您不需要执行本节中描述的任何操作。
环境设置
-
给定以下 phpstorm 配置:[图片链接](https://rawcdn.githack.com/ntavelis/dockposer/HEAD/assets/phpstorm_xdebug_settings.png)
-
注意:在这里,我们将服务器配置命名为
application
,该名称应与调试命令中的PHP_IDE_CONFIG="serverName=application"
匹配。 -
注意:取消选中此配置是一个好主意,设置 -> 语言 & 框架 -> 调试 -> 取消选中:在未指定路径映射时强制在第一行断点。
-
-
在与此包相同级别上创建另一个项目。因此,您具有以下目录结构
/home/antavelis/webprojects/dockposer
-> 此处克隆的包/home/antavelis/webprojects/demoapp
-> 带有 composer.json 文件的 PHP 应用程序 -
在 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 将符号链接包,并将其识别为插件。
-
您需要 Docker 和 Docker Compose,请在继续之前安装它们。
执行调试命令
- 导航到包的根目录,例如
/home/antavelis/webprojects/dockposer
- 导航到 Docker 文件夹:
cd ./docker
- 在 phpstorm 中设置断点,例如在类
src/DockposerPlugin.php
中的代码中 - 执行
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,这样我们就可以调试我们的应用程序。
- 注意:此环境变量