在Docker镜像中用我自己的replace默认configuration

我在下面的Dockerfile中工作:

RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive \ apt-get install -y \ curl \ apache2 \ php5 \ php5-cli \ libapache2-mod-php5 \ php5-gd \ php5-json \ php5-mcrypt \ php5-mysql \ php5-curl \ php5-memcached \ php5-mongo \ zend-framework # Install Composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ chown www-data /usr/local/bin/composer && composer --version # Install usefull PHP tools RUN composer global require sebastian/phpcpd && \ composer global require phpmd/phpmd && \ composer global require squizlabs/php_codesniffer # Install xdebug after we install composer since it cause issues # see https://getcomposer.org/doc/articles/troubleshooting.md#xdebug-impact-on-composer RUN apt-get install -y php5-xdebug 

正如你可能会注意到这个安装PHP 5.5.x,它带有我想用我自己的值覆盖的默认configuration。

我有以下目录结构:

 docker-php55/ ├── container-files │  ├── config │  │  └── init │  │  └── vhost_default │  └── etc │  └── php.d │  ├── zz-php-directories.ini │  └── zz-php.ini ├── Dockerfile ├── LICENSE ├── README.md └── run 

文件zz-php-directories.inizz-php.ini是我的configuration,我应该在创build映像时写入/etc/php5/apache2/php.ini 。 这些文件的内容如下:

 zz-php.ini ; Basic configuration override expose_php = Off memory_limit = 512M post_max_size = 128M upload_max_filesize = 128M date.timezone = UTC max_execution_time = 120 ; Error reporting display_errors = stderr display_startup_errors = Off error_reporting = E_ALL ; A bit of performance tuning realpath_cache_size = 128k ; OpCache tuning opcache.max_accelerated_files = 32000 ; Temporarily disable using HUGE PAGES by OpCache. ; This should improve performance, but requires appropriate OS configuration ; and for now it often results with some weird PHP warning: ; PHP Warning: Zend OPcache huge_code_pages: madvise(HUGEPAGE) failed: Invalid argument (22) in Unknown on line 0 opcache.huge_code_pages=0 ; Xdebug [Xdebug] xdebug.remote_enable = true xdebug.remote_host = "192.168.3.1" // this IP should be the host IP xdebug.remote_port = "9001" xdebug.idekey = "XDEBUG_PHPSTORM" zz-php-directories.ini ; Configure temp path locations sys_temp_dir = /data/tmp/php upload_tmp_dir = /data/tmp/php/uploads session.save_path = /data/tmp/php/sessions uploadprogress.file.contents_template = "/data/tmp/php/upload_contents_%s" uploadprogress.file.filename_template = "/data/tmp/php/upt_%s.txt" 

如何在创build图像时使用这些文件上的默认php.ini参数覆盖图像上的参数?

编辑:改善问题

留下一个例子, zz-php.ini是放置在我的笔记本电脑中的本地文件。 只要我在图像中安装PHP它带有一个默认的configuration文件,这意味着我应该在/etc/php5/apache2/php.ini文件。

这个默认的configuration文件已经有了默认的值,例如: expose_php = On (这是默认的,其他的是;realpath_cache_size = )所以我想要做的就是改变默认文件的值与我的文件中的值, 换一种说法:

 default (as in /etc/php5/apache2/php.ini) expose_php = On override (as in zz-php.ini) expose_php = Off 

最后,我应该从/etc/php5/apache2/php.ini覆盖zz-php.ini的值

至于主机的IP地址,我想我可以使用一个ENVvariables,并传递给build作为一个参数,我是对的? 如果不是,那么如何获得该设置所需的主机IP地址?

这是两个问题。

1)只需使用COPY指令复制你的本地php.ini到图像位置。 例如:

 COPY php.ini /etc/php5/apache2/php.ini 

2)你不想硬编码到你的图像的任何IP。 这需要在容器启动时完成。 HOST_IP执行此操作的标准方法是指定一个像HOST_IP这样的环境variables,并使用shell脚本在启动时对容器进行修改。 例如:

您的inject.sh脚本:

 #!/usr/bin/bash sed -i -E "s/xdebug.remote_host.*/xdebug.remote_host=$HOST_IP/" /etc/php5/apache2/php.ini 

您需要在构build时将inject.sh文件添加到图像中。

 COPY inject.sh /usr/local/bin/ 

然后你可以初始化并启动你的容器,如下所示:

 docker run -e HOST_IP=53.62.10.12 mycontainer bash -c "inject.sh && exec myphpapp" 

exec需要确保myphpapp成为容器的主进程(即:它具有PID 1),否则将不会收到kill命令(如Ctrl-C)。