通过DockerFile而不是PHP 5.5.9安装PHP 5.5.30

时间:2017-01-14 00:07:56

标签: php docker docker-compose dockerfile php-5.5

我遇到一个问题,我的PHP版本正在影响我试图在docker容器内运行的项目。

当我在容器中运行php -v时,我得到了这个。

PHP 5.5.9-1ubuntu4.20 (cli) (built: Oct  3 2016 13:00:37) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

我的目标是让“php -v”命令结果如下所示。它现在在工作机器上发挥作用。

PHP 5.5.30 (cli) (built: Dec 12 2015 21:28:27)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Suhosin v0.9.36, Copyright (c) 2007-2014, by SektionEins GmbH

我需要降级的原因是,这两个版本之间的date()函数如何工作导致PDO Extention中出现崩溃错误,这一点有所改变(带有消息的异常'PDOException') 'SQLSTATE [22007]:日期时间格式无效:1292日期时间值不正确:'2017-01-13 23:47:31 UTC'

更改PHP版本似乎解决了这个问题。为了节省时间,因为它是一个庞大的项目,我需要将其部署到活动用户,我需要切换PHP版本。

我的泊坞窗文件如下所示。

FROM ubuntu:14.04
MAINTAINER Joe Astrahan <****>

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-mysql \
      php5-pgsql \
      php5-curl

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

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

运行文件如下:

#!/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

我不知道如何安装特定版本的php 5.5.30 ,因为它总是安装5.9。我环顾谷歌,找不到任何东西。任何帮助表示赞赏!

如果下面需要我的docker-compose.yml文件。

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

    dbdev:
        image: mysql:5.7.17
        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:/usr/local/etc/php/php.ini
            - ./config/apache_default.conf:/etc/apache2/sites-enabled/000-default.conf
        restart: always
        ports: 
            - "80:80"
            - "443:443"
        environment:
           TEST: testenviromentvar

我模糊了密码,但只是自己设置数据库。注意,使用docker exec 8d8a115f6d6b php -v来测试容器中的php版本。在运行docker-compose up之后,#s的混乱是容器ID ...

对于那些好奇的PHP中的行当前错误,它在下面。

$ class-&gt; created = date('Y-m-d H:i:s',time());

$ validated = $ class-&gt; save();

我得到了这个确切的错误消息,异常'PDOException',消息'SQLSTATE [22007]:无效的日期时间格式:1292不正确的日期时间值:'2017-01-13 23:47:31 UTC'用于“创建”列/var/www/public_html/devsite/vendor/php-activerecord/php-activerecord/lib/Connection.php:322中的第1行

错误是因为UTC,但由于某种原因,这不会导致5.5.30中的问题?

1 个答案:

答案 0 :(得分:0)

感谢xn20c的帮助,我找到了解决方案。

首先让你的dockerfile看起来像这样。

FROM ubuntu:14.04
MAINTAINER Your Name <your@email.com>

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

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

接下来你会注意到它在最后寻找一个运行脚本,它还有一个特殊的脚本,可以从源代码安装php 5.5.30。

<强> 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

以上安装PHP并使用--enable-mbstring启用mbstring模块。通常PHP默认安装此软件包,但是当您按源编译时,您必须启用它。这适用于您可能需要的任何其他软件包,只需查看--enable标志将是什么并将其添加到那里。

最后,我的运行脚本会对php.ini文件做一些最后一分钟的更改,我觉得这很好。

生成

#!/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

最后将这一切与像这样的docker-compose文件一起...

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/apache_default.conf:/etc/apache2/sites-enabled/000-default.conf
        restart: always
        ports: 
            - "80:80"
            - "443:443"

然后只需运行... docker-compose up -d --remove-orphans

并将Dockerfile放在同一个目录中,你有一个完全正常工作的php 5.5.30服务器,支持MySQL(live和amp; dev数据库)甚至PHPMyAdmin,可以通过8081端口访问(localhost:8081)

希望这有助于某人!

- 重要的附注 -

确保您的php.ini文件不会更改extention_dir ,否则您将遇到CURL无法找到正确的扩展路径等问题...