Php 如何";“动态化”;Dockerfile/Docker编写?
我正在对遗留PHP项目进行归档。我希望在开发环境中启用Xdebug,我的Dockerfile将预构建的php.ini复制到容器中 由于某些网络问题,我们必须在Mac OS X上安装Php 如何";“动态化”;Dockerfile/Docker编写?,php,docker,docker-compose,xdebug,Php,Docker,Docker Compose,Xdebug,我正在对遗留PHP项目进行归档。我希望在开发环境中启用Xdebug,我的Dockerfile将预构建的php.ini复制到容器中 由于某些网络问题,我们必须在Mac OS X上安装xdebug.remote\u connect\u back=0(以及相应的xdebug.remote\u host=docker.for.Mac.localhost)和Linux上的xdebug.remote\u connect\u back=1 是否可以在Dockerfile/Docker Compose中获取当前
xdebug.remote\u connect\u back=0
(以及相应的xdebug.remote\u host=docker.for.Mac.localhost
)和Linux上的xdebug.remote\u connect\u back=1
是否可以在Dockerfile/Docker Compose中获取当前操作系统类型,以复制与主机操作系统对应的php.ini 这些信息在映像构建时不可用(也不应该)。相同的基于Linux的映像可以运行在本机Linux、Mac上的Linux VM(然后是Docker机器VM或Docker for Mac提供的隐藏VM)、Windows上的Linux VM,甚至Linux上的Linux VM,而不管它最初构建在何处
应在容器运行时提供主机名等配置。环境变量是执行此操作的典型方式,或者您可以使用Docker卷机制从主机推入配置文件
如果您的问题纯粹是调试应用程序,那么您还可以在主机上设置完整的开发环境,并且只在映像中内置在更像生产环境中运行它所需的内容。使用docker compose.yml中的卷。在config
文件夹(或任何位置)中创建php.linux.ini
和php.mac.ini
,并将其中一个映射到容器:
services:
php:
image: php
volumes:
- ./config/php.linux.ini:/etc/php.ini #or wherever the config is
当然,您的用户将不得不手动更改php.linux.ini
的php.mac.ini
,但这是一次手动更改。我决定使用Docker Compose读取.env
文件的能力。整个工作流程如下:
- 创建带有所有注释行的
.env.sample
文件(抱歉,无法正确显示注释行):
OS=windows
OS=linux
OS=mac
- 通过在
.gitignore
文件中添加/.env
行来忽略.env
文件
- 使用
$cp.env.sample.env
复制示例文件,只保留与操作系统对应的一行未注释
- 将php.ini中特定于操作系统的Xdebug相关部分移动到单独的文件中,文件名为
Xdebug mac.ini
,Xdebug windows.ini
,Xdebug linux.ini
,等等
- 将docker compose.yml添加到所选服务的
args
部分,其值类似于-OS=${OS}
- 在相应的
Dockerfile
中添加行:
ARG OS=${OS}
复制./xdebug-${OS}.ini/usr/local/etc/php/conf.g/
.env
中提到的OS值将在构建映像时展开
- 执行
$docker compose up-d--build
构建映像并启动容器
- 在success上提交所有更改,让您的同事在任何平台上正确设置Xdebug;别忘了告诉他们从模板中创建自己的
.env
文件实例