【问题标题】:How to "dynamize" Dockerfile / Docker Compose?如何“动态化” Dockerfile / Docker Compose?
【发布时间】:2018-09-22 07:31:14
【问题描述】:
我正在对遗留的 PHP 项目进行 Dockerizing。我想在开发环境中启用 Xdebug,并且我的 Dockerfile 将预先构建的 php.ini 复制到容器中。
由于一些网络问题,我们必须在 Mac OS X 上使用 xdebug.remote_connect_back = 0(以及在 Linux 上对应的 xdebug.remote_host = docker.for.mac.localhost)和 xdebug.remote_connect_back = 1。
是否可以在 Dockerfile/Docker Compose 中获取当前操作系统类型以复制与主机操作系统对应的 php.ini?
【问题讨论】:
标签:
php
docker
docker-compose
xdebug
【解决方案1】:
在docker-compose.yml 中使用volumes described here。在 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,但这是一次性手动更改。
【解决方案2】:
该信息在映像构建时不(也不应该)可用。相同的基于 Linux 的映像可以在本机 Linux、Mac 上的 Linux VM(然后是 Docker Machine VM 或 Docker for Mac 提供的隐藏 VM)、Windows 上的 Linux VM 甚至 Linux 上的 Linux VM 上运行,不管它最初是在哪里建造的。
应在容器运行时提供主机名等配置。环境变量是执行此操作的典型方式,也可以使用 Docker 卷机制从主机推送配置文件。
如果您的问题纯粹是围绕调试您的应用程序,您还可以在主机上设置完整的开发环境,并且只在您的映像中构建运行它所需的内容。生产环境。
【解决方案3】:
我决定使用 Docker Compose 读取.env 文件的能力。整个工作流程如下:
- 创建
.env.sample 文件,所有行都已注释(抱歉,无法正确显示注释行):
OS=windows
OS=linux
OS=mac
通过将/.env 行添加到.gitignore 文件来忽略.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}
COPY ./xdebug-${OS}.ini /usr/local/etc/php/conf.g/
.env 中提到的操作系统值将在构建映像时扩展