通过DockerFile而不是PHP5.5.9安装PHP5.5.30
我有一个问题,我的PHP版本正在影响我试图在docker容器中运行的项目 当我在容器中运行通过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-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可能是一个候选版本。