通过DockerFile而不是PHP5.5.9安装PHP5.5.30

通过DockerFile而不是PHP5.5.9安装PHP5.5.30,php,docker,docker-compose,dockerfile,php-5.5,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,

我有一个问题,我的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扩展中出现崩溃错误,这与此调整有关(exception'PDOException',消息'SQLSTATE[22007]:无效的日期时间格式:1292不正确的日期时间值:“2017-01-13 23:47:31 UTC”

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

我的docker文件如下所示。

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"]
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
我不知道如何安装PHP5.5.30的特定版本,因为它总是安装5.9。我在谷歌上四处搜索,什么也找不到。感谢您的帮助

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

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"]
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等后的容器id

对于那些对PHP中当前出现的错误感到好奇的人,请参见下面的内容

$class->created=date('Y-m-dh:i:s',time())

$validated=$class->save()

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


该错误是由UTC造成的,但由于某种原因,这不会导致5.5.30中出现问题。

感谢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并使用--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编写的文件将所有内容放在一起,如下所示

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--删除孤立项

将Dockerfile放在同一个目录中,您就有了一个完全可以工作的PHP5.5.30服务器,它支持MySQL(live&dev数据库),甚至可以在端口8081(localhost:8081)上访问PHPMyAdmin

希望这对别人有帮助

--重要的旁注--


确保您的php.ini文件不会更改扩展目录,否则您会遇到诸如CURL找不到正确的扩展路径等问题。

您可以发布php代码吗?我知道这不是你要求的,但我认为最好是修复这个错误,而不是降级你的PHP版本…我在我的帖子中提到,我不能,很多地方都会发生错误。我们正在讨论数百万行代码。我将最终修复代码,以适应稍后的php版本。现在我只需要它暂时工作。5.6版怎么样?或者,更好的是,这些都不起作用,7.0的兼容性更差。我确实尝试了所有这些,我更新了问题的确切php行,因为php版本的问题,所以你有一些参考。顺便说一句,即使7.0修复了这个特定错误,7.0在兼容性方面也破坏了很多其他东西,因此,如果5.6可以工作的话,那么只有5.6可能是一个候选版本。