Docker-Compose 不会批量处理我的 php.ini 文件
Docker-Compose won't volume my php.ini file
我正在尝试使用 docker-compose 来增加我的 php.ini 文件的容量,这样我就可以在我的本地计算机上即时进行更改,以查看它如何影响主机。不幸的是,到目前为止,我能够将 php.ini 文件放入容器的唯一方法是直接在 Dockerfile 中创建期间。
附件是容器的图像 运行 符合以下当前设置。
我的 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() 将始终显示为关闭。尽管加载了我的配置文件,但请参阅我的附件图片展示它。
我什至不确定它是否真的遵守其中的任何命令?
使用了额外的文件
运行
#!/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
我的文件结构
我找到了答案,将一个名为 custom.php.ini 的文件放在配置目录中(如果您遵循我的目录结构)。
在我的示例中像这样设置音量...
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 才能强制更改。
如果您正在使用类似 wodby(docker4php
或 docker4drupal
)或 lando 或尝试找到“为什么 php.ini 不起作用”的答案(像我一样),这些工具使用它们自己的方式将配置传递到 php
https://github.com/wodby/php#php-and-php-fpm-configuration
我在这里发布这个答案是因为我浪费了 2 个小时来寻找答案,并且我是从 google 进入这个问题的。我想为别人节省一些时间。
自定义安装。php.ini 无济于事。
我正在尝试使用 docker-compose 来增加我的 php.ini 文件的容量,这样我就可以在我的本地计算机上即时进行更改,以查看它如何影响主机。不幸的是,到目前为止,我能够将 php.ini 文件放入容器的唯一方法是直接在 Dockerfile 中创建期间。
附件是容器的图像 运行 符合以下当前设置。
我的 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() 将始终显示为关闭。尽管加载了我的配置文件,但请参阅我的附件图片展示它。
我什至不确定它是否真的遵守其中的任何命令?
使用了额外的文件
运行
#!/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
我的文件结构
我找到了答案,将一个名为 custom.php.ini 的文件放在配置目录中(如果您遵循我的目录结构)。
在我的示例中像这样设置音量...
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 才能强制更改。
如果您正在使用类似 wodby(docker4php
或 docker4drupal
)或 lando 或尝试找到“为什么 php.ini 不起作用”的答案(像我一样),这些工具使用它们自己的方式将配置传递到 php
https://github.com/wodby/php#php-and-php-fpm-configuration
我在这里发布这个答案是因为我浪费了 2 个小时来寻找答案,并且我是从 google 进入这个问题的。我想为别人节省一些时间。
自定义安装。php.ini 无济于事。