无法更新 Docker 容器中的 php.ini 文件
Posted
技术标签:
【中文标题】无法更新 Docker 容器中的 php.ini 文件【英文标题】:can't update php.ini file in Docker container 【发布时间】:2017-02-13 23:47:57 【问题描述】:我正在尝试使用 nginx 和 php7 在 Docker 上设置 Magento2。
按照PHP7 Docker image 的建议,我添加了一个自定义 php.ini 文件。我可以从 phpinfo.php 看到它正在加载我的 php.ini 文件,但我的更新都没有。
应该是:
memory_limit = 2G
max_execution_time = 800
我检查了 PHP 容器,可以看到 php.ini 文件的设置正确,或者我认为是这样?
$ docker exec -it mymagento2docker_php_1 /bin/bash
# cat /usr/local/etc/php/php.ini
; This file is created automatically by the docker build
memory_limit = 2G
max_execution_time = 800
我做错了什么?以下是更多详细信息,在此先感谢!
Docker 项目
.
├── docker-compose.yml
├── index.php
├── magento2
│ ├── [DIRECTORIES & FILES OMMITED]
│
├── nginx
│ ├── Dockerfile
│ ├── default.conf
│ └── nginx.conf
├── output.txt
├── php
├── Dockerfile
└── config
└── php.ini
docker-compose.yml
nginx:
build: ./nginx/
ports:
- 80:80
links:
- php
volumes_from:
- app
php:
build: ./php/
expose:
- 9000
links:
- mysql
volumes_from:
- app
app:
image: php:7.0-fpm
volumes:
- ./magento2:/var/www/html
command: "true"
mysql:
image: mysql:latest
volumes_from:
- data
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: mage2
MYSQL_DATABASE: mage2
MYSQL_USER: mage2
MYSQL_PASSWORD: mage2
data:
image: mysql:latest
volumes:
- /var/lib/mysql
command: "true"
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- 8080:80
links:
- mysql
environment:
PMA_HOST: mysql
php/Dockerfile
FROM php:7.0-fpm
# Install dependencies
RUN apt-get update \
&& apt-get install -y \
cron \
libfreetype6-dev \
libicu-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
libxslt1-dev
# Configure the gd library
RUN docker-php-ext-configure \
gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
# Install required PHP extensions
RUN docker-php-ext-install \
gd \
intl \
mbstring \
mcrypt \
pdo_mysql \
xsl \
zip \
soap
# Install the 2.4 version of xdebug that's compatible with php7
RUN pecl install -o -f xdebug-2.4.0
COPY config/php.ini /usr/local/etc/php/
## php/config/php.ini ##
; This file is created automatically by the docker build
memory_limit = 2G
max_execution_time = 800
更新
我试过用下面的方法重启 nginx,但是没用。
$ docker exec -it mymagento2docker_php_1 /bin/bash
# /etc/init.d/nginx restart
bash: /etc/init.d/nginx: No such file or directory
# service nginx restart
nginx: unrecognized service
# nginx -s reload
bash: nginx: command not found
# exit
$ docker restart mymagento2docker_nginx_1
mymagento2docker_nginx_1
$ docker exec -it mymagento2docker_nginx_1 /bin/bash
# /etc/init.d/nginx restart
Restarting nginx: nginxross in ~/my-magento2-docker
$ docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------
mymagento2docker_app_1 true Exit 0
mymagento2docker_data_1 docker-entrypoint.sh true Exit 0
mymagento2docker_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp
mymagento2docker_nginx_1 nginx -g daemon off; Exit 0
mymagento2docker_php_1 php-fpm Up 9000/tcp
mymagento2docker_phpmyadmin_1 /run.sh phpmyadmin Up 0.0.0.0:8080->80/tcp
ross in ~/my-magento2-docker
$ docker-compose up -d
Starting mymagento2docker_app_1
Starting mymagento2docker_data_1
mymagento2docker_mysql_1 is up-to-date
mymagento2docker_phpmyadmin_1 is up-to-date
mymagento2docker_php_1 is up-to-date
Starting mymagento2docker_nginx_1
ross in ~/my-magento2-docker
$ docker exec -it mymagento2docker_nginx_1 /bin/bash
# service nginx restart
Restarting nginx: nginxross in ~/my-magento2-docker
$ docker-compose up -d
Starting mymagento2docker_app_1
Starting mymagento2docker_data_1
mymagento2docker_mysql_1 is up-to-date
mymagento2docker_phpmyadmin_1 is up-to-date
mymagento2docker_php_1 is up-to-date
Starting mymagento2docker_nginx_1
ross in ~/my-magento2-docker
$ docker exec -it mymagento2docker_nginx_1 /bin/bash
# nginx -s reload
2016/10/05 14:07:43 [notice] 12#12: signal process started
#
【问题讨论】:
【参考方案1】:这就是发生的事情: - 如果您将 php.ini 从主机映射到容器,请确保在启动容器之前主机上必须存在该文件 (php.ini)。否则容器不会启动 - 请检查 docker 是否能够读取您的 php.ini 文件(检查权限,有时 docker 以不同的用户身份运行并且无法访问属于 root 的主机文件) - 每次更新php.ini都要重启php-fpm(进入容器重启php-fpm测试,不要重建容器),并清除缓存(如果开启opcache)
【讨论】:
【参考方案2】:在 docker-compose.yml 文件中将 volumes: 部分添加到您的 php 服务,使用 映射本地目录>custom.ini 文件到 /usr/local/etc/php/conf.d,然后重启你的容器。该文件中的任何有效设置都将覆盖主 php.ini 文件中的设置。 (顺便说一句,你可以用 MySQL 做同样的事情,但不能用 Nginx)。
这适用于我自己的项目:
php:
volumes:
- ./localpath/custom.ini:/usr/local/etc/php/conf.d/custom.ini
【讨论】:
我想详细说明您的回答,因为这有助于解决我的其他问题之一。我正在使用 docker-compose kill 来杀死容器,并且想知道为什么这些更改从未生效。由于 docker-compose 缓存是更改的结果,因此请确保在执行此操作后启动容器之前使用 docker-compose down 强制删除容器,然后它将正确加载 php.ini 文件。希望这可以为我节省 8 个小时的头痛时间。 谢谢!这正是我所需要的。 那么,这是否只添加您指定的设置?或者如果您链接custom.ini,它是否只会放入您指定的设置?另外,可以叫custim.ini还是叫php.ini?【参考方案3】:我认为您必须重新加载 nginx 配置。 我不知道您的 php 容器使用哪个操作系统,但请在容器内部尝试其中一些:
# /etc/init.d/nginx restart
# service nginx restart
# nginx -s reload
我的逻辑原因是,你安装了 php(并同时启动它),毕竟你复制了新的配置。
【讨论】:
我会将这些代码行放在哪里?在 php/Dockerfile 中?我猜他们前面没有# 当然没有评论标签。在你的 nginx 容器内。否则,您可以尝试在 php 容器中重新启动 php-fpm: /etc/init.d/php7-fpm restart 或 service php7-fpm restart 可能只是 php-fpm restart 没有版本号。这是我的研究链接cyberciti.biz/faq/unix-linux-restart-php-service-command 谢谢我试过了,但没有成功,请看我的更新 与这个答案类似(足以不做单独的答案),我不得不用“apachectl restart”重新启动apache以上是关于无法更新 Docker 容器中的 php.ini 文件的主要内容,如果未能解决你的问题,请参考以下文章
具有自定义 php.ini 文件设置的 Docker Wordpress 容器
如何设置 php 配置文件 (php.ini) 在 laradock 的 phpmyadmin 容器中使用