在Docker镜像中用我自己的默认配置替换默认配置

时间:2016-09-23 12:35:57

标签: docker dockerfile

我正在使用以下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.inizz-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地址?

1 个答案:

答案 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) )。