无法在Docker容器中更新php.ini文件

41

我正在尝试在Docker上使用Nginx和PHP7搭建Magento2。

PHP7 Docker映像所建议,我已经添加了自定义的php.ini文件。我可以从phpinfo.php看到它正在加载我的php.ini文件,但是我所有的更新都没有显示出来。 enter image description here enter image description here enter image description here

应该是:

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
# 
3个回答

78
在docker-compose.yml文件的php服务中添加一个volumes部分,将本地目录与自定义的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

21
我想对你的回答进行详细说明,因为这帮助了我解决另一个问题。我一直在使用docker-compose kill命令来杀死容器,但是我一直在想为什么更改没有生效。因为docker-compose缓存了更改的结果,请务必在执行更改后使用docker-compose down命令强制关闭容器,然后再重新启动它们,这样它将正确加载php.ini文件。希望这可以节省某人8个小时的头痛,因为我也曾经遭遇过类似的问题。 - Joseph Astrahan
谢谢!这正是我所需要的。 - JD-
2
那么,这只会添加您指定的设置吗?还是只有在链接custom.ini时才会放置您指定的设置?此外,它可以被称为custim.ini还是应该被称为php.ini? - techcase

1
我认为您需要重新加载nginx配置。 我不知道您的php容器使用哪个操作系统,但是尝试在容器内执行以下操作之一:
# /etc/init.d/nginx restart

# service nginx restart

# nginx -s reload

我的逻辑推断是,您需要安装 PHP(并同时启动它),最后再复制新的配置文件。

我应该把这些代码放在哪里?是在php/Dockerfile中吗?我猜想不需要在它们前面加上 #。 - Holly
当然,要在您的nginx容器内尝试重新启动php容器中的php-fpm,请使用以下命令:/etc/init.d/php7-fpm restart或service php7-fpm restart,也可以只使用php-fpm restart而不带版本号。这是我的研究链接http://www.cyberciti.biz/faq/unix-linux-restart-php-service-command/。 - Gabbax0r
谢谢,我已经尝试过了,但没有成功,可以看到我的更新。 - Holly
与这个答案类似(足以不需要单独的答案),我必须使用“apachectl restart”重新启动apache。 - Alkanshel

0
这是发生的事情: - 如果你将主机上的php.ini映射到容器中,请确保在启动容器之前主机上存在该文件(php.ini)。否则,容器将无法启动。 - 请检查docker是否能够读取您的php.ini文件(检查权限,有时docker以不同的用户身份运行,无法访问属于root的主机文件)。 - 每次更新php.ini后,您必须重新启动php-fpm(进入容器并重新启动php-fpm进行测试,不要重建容器),并清除缓存(如果启用了opcache)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接