php - Docker-Compose 不会批量处理我的 php.ini 文件

标签 php docker docker-compose dockerfile docker-volume

我正在尝试使用 docker-compose 对我的 php.ini 文件进行批量处理,这样我就可以在我的本地计算机上即时进行更改,以查看它如何影响主机。不幸的是,到目前为止,我能够将 php.ini 文件放入容器的唯一方法是直接在 Dockerfile 中创建期间。

附件是在当前设置下运行良好的容器图像。

enter image description here

我的 Dockerfile 如下:

FROM ubuntu:14.04
MAINTAINER Joe Astrahan <jastrahan@poolservice.software>

VOLUME ["/var/www"]


RUN apt-get update && \
    apt-get install -y software-properties-common && \
    apt-get update && \
    apt-get install -y \
      apache2 \
      curl \
      libcurl3 \
      libcurl3-dev \
      php5 \
      php5-cli \
      libapache2-mod-php5 \
      php5-gd \
      php5-json \
      php5-ldap \
      php5-mysqlnd \
      php5-pgsql \
      php5-curl \
      mysql-client

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

# install php-5.5.30
COPY config/install_php-5.5.30.sh /tmp/install_php-5.5.30.sh
RUN /bin/bash /tmp/install_php-5.5.30.sh


COPY config/apache_default.conf /etc/apache2/sites-available/000-default.conf
COPY config/run /usr/local/bin/run

RUN chmod +x /usr/local/bin/run
RUN a2enmod rewrite

#This will allow us to modify files in the container for testing if we need to
RUN apt-get update && \
    apt-get install -y vim

EXPOSE 80
CMD ["/usr/local/bin/run"]

我的 docker-compose.yml 文件如下:

version: '2'
services:
    dblive:
        image: mysql:5.5.52
        volumes:
            - ./db_data_live:/var/lib/mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: ****
            MYSQL_DATABASE: ****
            MYSQL_USER: ****
            MYSQL_PASSWORD: ****

    dbdev:
        image: mysql:5.5.52
        volumes:
            - ./db_data_dev:/var/lib/mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD:****
            MYSQL_DATABASE: ****
            MYSQL_USER: ****
            MYSQL_PASSWORD: ****

    phpmyadmin:
        depends_on:
            - dblive
            - dbdev
        image: phpmyadmin/phpmyadmin
        environment:
            PMA_ARBITRARY : 1
        restart: always
        ports:
            - "8081:80"

    web:
        build: ./
        depends_on:
            - dblive
            - dbdev
        volumes:
            - ./web:/var/www
            - ./config/php.ini:/etc/php5/apache2/conf.d/custom.ini
            - ./logs/apache_error.log:/var/log/apache2/error.log
            - ./logs/apache_access.log:/var/log/apache2/access.log
            - ./config/apache_default.conf:/etc/apache2/sites-enabled/000-default.conf
        restart: always
        ports: 
            - "80:80"
            - "443:443"

我试着按照这里的建议,can't upate php.ini file in Docker container ,通过创建一个 custom.ini 文件并将其安装在该位置。我认为我实际上做对了,因为如果你看一下我为 phpinfo() 附加的图像,你可以看到在解析的其他 .ini 文件下,我的 custom.ini 在最后。我通过设置 asp_tags = On 而不是 Off 进行了测试,但我做不到。 phpinfo() 将始终显示为关闭。尽管加载了我的配置文件,请参阅我的附件图片。

我什至不确定它是否真的遵守其中的任何命令?

enter image description here

enter image description here

使用的额外文件

运行

#!/bin/bash
set -e

PHP_ERROR_REPORTING=${PHP_ERROR_REPORTING:-"E_ALL & ~E_DEPRECATED & ~E_NOTICE"}
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php5/apache2/php.ini
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php5/cli/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php5/apache2/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php5/cli/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php5/apache2/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php5/cli/php.ini

source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND

install_php-5.5.30.sh

#!/bin/bash

# install dependencies
apt-get -y update && \
apt-get install -y \
  build-essential \
  apache2-dev \
  libxml2-dev

# download PHP 5.5.30 source code
cd /tmp
curl -fsSL http://php.net/get/php-5.5.30.tar.bz2/from/this/mirror | tar xjf -
cd php-5.5.30

# configure build options
./configure --prefix=/usr \
            --with-config-file-path=/etc/php5/apache2 \
            --with-config-file-scan-dir=/etc/php5/apache2/conf.d \
            --disable-pdo \
            --disable-json \
            --enable-mbstring \
            --with-apxs2

# compile and install
NUM_CORES=`cat /proc/cpuinfo | grep processor | wc -l`
make -j $NUM_CORES
make install

# configure extension directory
echo 'extension_dir="/usr/lib/php5/20121212"' >> /etc/php5/apache2/php.ini

# cleanup
rm -rf /tmp/php-5.5.30 /tmp/install_php-5.5.30.sh

我的文件结构

enter image description here

最佳答案

我找到了答案,将一个名为 custom.php.ini 的文件放在 config 目录中(如果您遵循我的目录结构)。

在我的示例中像这样设置音量...

volumes:
            - ./web:/var/www
            - ./config/custom.php.ini:/etc/php5/apache2/conf.d/custom.php.ini

默认情况下,额外 php 文件的扫描目录将在 conf.d 目录中查找。这些文件将覆盖主 php.ini 的设置。我使用 asp_tag 选项对其进行了测试,将其关闭和打开。只要您执行以下操作,它就可以正常工作。

完成这项工作的诀窍是使用 docker-compose down 而不是 docker-compose kill

这将删除容器及其缓存文件。 PHP 仅在启动时加载配置文件一次,其他文件因此更改 php.ini 或自定义文件后需要此 docker-compose down 以强制更改。

关于php - Docker-Compose 不会批量处理我的 php.ini 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41691584/

相关文章:

javascript - 我如何从 View 页面中的下面的 javascript 代码调用 Controller 函数(Codeigniter)

PHP PDO 参数编号无效。虽然所有参数都已设置

docker-compose 将图像推送到注册表不起作用

php - 错误 : Can't drop privilege as nonroot user: container keeps restarting on Google Cloud Compute Engine

java - Docker-compose 容器与 MySql 的连接不起作用

docker-compose - FileBeat 不将 docker-container 日志发送到 Elastic-search

nginx - Docker-registry v2 带有 tls 和 nginx 身份验证错误背后的基本身份验证

php - 如何管理厚框 tb_show 函数中的参数?

php - Wordpress 自定义插件 CSS 和 <li> 标签

docker - 在docker中启用squashfs