在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.ini
和zz-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地址,我想我可以使用一个ENV
variables,并传递给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)。