如何“动态化” Dockerfile / Docker Compose?

时间:2018-09-22 07:31:14

标签: php docker docker-compose xdebug

我正在对旧版PHP项目进行Dockerizing。我想在开发环境中启用Xdebug,我的Dockerfile将预先构建的php.ini复制到容器中。

由于某些网络问题,我们必须在Mac OS X(和相应的xdebug.remote_connect_back = 0)上安装xdebug.remote_host = docker.for.mac.localhost,在Linux上安装xdebug.remote_connect_back = 1

是否可以在Dockerfile / Docker Compose中获取当前操作系统类型以复制与主机操作系统相对应的php.ini?

3 个答案:

答案 0 :(得分:1)

volumes中使用docker-compose.yml described here。在php.linux.ini文件夹(或任意位置)中创建php.mac.iniconfig,并将其中之一映射到容器:

services:
  php:
    image: php
    volumes:
      - ./config/php.linux.ini:/etc/php.ini #or wherever the config is

当然,您的用户必须手动将php.linux.ini更改为php.mac.ini,但这是一次手动更改。

答案 1 :(得分:0)

在图像生成时该信息不可用(也不应该)。可以在本地Linux,Mac上的Linux VM(然后是Docker Machine VM或Docker for Mac提供的隐藏VM),Windows上的Linux VM甚至Linux上的Linux VM上运行相同的基于Linux的映像,而不管它最初是在哪里建造的。

诸如主机名之类的配置应在容器运行时提供。环境变量是执行此操作的典型方法,或者您可以使用Docker卷机制从主机推送配置文件。

如果您的问题完全是关于调试您的应用程序的,则您还可以在主机上设置完整的开发环境,并且仅将所需的内容内置到映像中,以便在其他环境中运行它。生产环境。

答案 2 :(得分:0)

我决定使用Docker Compose功能来读取extension ViewController: MKMapViewDelegate { func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { let center = getCenterLocation(for: mapView) let geoCoder = CLGeocoder() guard let previousLocation = self.previousLocation else { return } guard center.distance(from: previousLocation) > 50 else { return } self.previousLocation = center geoCoder.reverseGeocodeLocation(center) { [weak self] (placemarks, error) in guard let self = self else { return } if let _ = error { //TODO show alert informing the user return } guard let placemark = placemarks?.first else { //TODO Show alert informing the user return } let streetNumber = placemark.subThoroughfare ?? "" let streetName = placemark.thoroughfare ?? "" DispatchQueue.main.async { self?.addressLabel.text = "\(streetNumber) \(streetName)" } } } } 文件。整个工作流程如下:

  • 创建带有所有注释行的<{1}}文件(抱歉,无法正确显示注释行).env
  • 通过在.env.sample文件中添加 OS=windows OS=linux OS=mac 行来忽略.env文件

  • 使用/.env复制示例文件,仅注释与您的操作系统相对应的一行

  • 将php.ini的特定于操作系统的Xdebug相关部分移动到名称分别为.gitignore$ cp .env.sample .envxdebug-mac.ini等的单独文件中。

  • 添加到xdebug-windows.ini xdebug-linux.ini部分中,以选定的服务,其值类似于docker-compose.yml

  • 在相应的args中添加以下行: - OS=${OS}

Dockerfile中提到的

OS值将在构建映像时间上扩展

  • 执行 ARG OS=${OS} COPY ./xdebug-${OS}.ini /usr/local/etc/php/conf.g/ 以构建映像并启动容器

  • 成功提交所有更改,以使您的同事可以在任何平台上正确设置Xdebug;不要忘记告诉他们从模板制作.env文件的实例