我正在使用以下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并且它附带了我想用我自己的值覆盖的默认配置。
我有以下目录结构:
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
是我在创建图像时应写入/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"
如何在创建图像时使用这些文件上的参数覆盖图像上的默认php.ini
参数?
编辑:改进问题
举一个例子,zz-php.ini
是放在我的笔记本电脑中的本地文件。一旦我在图像中安装PHP,它就会附带一个默认配置文件,这意味着我应该在/etc/php5/apache2/php.ini
下有一个文件。
此默认配置文件已具有默认值,例如: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
最后,我应该zz-php.ini
/etc/php5/apache2/php.ini
值已被覆盖
至于主机IP地址,我想我可以使用ENV
var并传递给build
作为参数,我是对的?如果不是,那么您将如何获得该设置所需的主机IP地址?
答案 0 :(得分:1)
这是两个问题。
1)只需使用COPY
指令将本地php.ini复制到图像位置即可。例如:
COPY php.ini /etc/php5/apache2/php.ini
2)您不想将任何IP硬编码到您的图像中。这需要在容器启动时完成。使用docker执行此操作的标准方法是指定一个环境变量,如HOST_IP
,并使用shell脚本在开始时对容器进行修改。例如:
您的inject.sh
脚本:
#!/usr/bin/bash
sed -i -E "s/xdebug.remote_host.*/xdebug.remote_host=$HOST_IP/" /etc/php5/apache2/php.ini
您需要在构建时将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) )。